【问题标题】:Understanding Shader Programming了解着色器编程
【发布时间】:2012-10-15 05:11:54
【问题描述】:

我正在尝试了解着色器编程,但在这一点上,文档无法进一步帮助我。

1]缓冲区的数据类型和大小是否必须匹配?

在 DX SDK 的 DX 教程 4 中,它们有一个结构:

struct SimpleVertex{
    XMFLOAT3 Pos;
    XMFLOAT4 Color;
};

在他们的着色器文件中,他们定义:

struct VS_OUTPUT{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR0;
};

他们将 Pos 定义为一个文件中为 3 的向量,而在另一个文件中为 4。这是如何正确的?我认为数据的大小必须匹配。

2]要创建另一个常量缓冲区,这是我需要做的步骤吗?

// Make in shader file
cbuffer LightBuffer : register(b0){
    float3 lDir;
    float4 lColor;
}

// Make in C++ file
struct LightBuffer{
    XMFLOAT3 Direction;
    XMFLOAT4 Color;
};

    ...

LightBuffer lb;
lb.Direction=XMFLOAT3(-1.0f, -10.0f, 4.0f); // Make an instance of it
lb.Color=XMFLOAT4(0.35f, 0.5f, 1.0f, 1.0f);

    ...

ID3D11Buffer* lightBuffer=NULL; // Declare in global scope

D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage=D3D11_USAGE_DEFAULT;
bd.ByteWidth=sizeof(LightBuffer);
bd.BindFlags=D3D11_BIND_CONSTANT_BUFFER;

hr=graphics->deviceInterface->CreateBuffer(&bd, NULL, &lightBuffer);

graphics->deviceContext->UpdateSubresource(lightBuffer, 0, NULL, &lb, 0, 0);

graphics->deviceContext->PSSetConstantBuffers(0, 1, &lightBuffer);

这些是我做的步骤,类似于教程中的常量缓冲区。它最终什么也没产生。

偶然发现如果我把LightBuffer::XMFLOAT3 Direction的类型改成XMFLOAT4,就可以了。我不明白什么?为什么我不能拥有我想要的类型?

感谢阅读。

【问题讨论】:

    标签: c++ directx buffer shader


    【解决方案1】:

    1-从结构的名称可以看出,它不是顶点着色器的输入而是输出。顶点着色器应将位置变量输出为 4 个浮点数(同质坐标)。所以在着色器文件的某个地方,应该有一个将向量扩展为 float4 变量的操作(类似于“float4(inputPos, 1.0);”)。

    2-这可能是对齐问题。 GPU 设计用于处理 4D 矢量。在使用常量缓冲区时,尝试首先使用矩阵创建结构,然后使用 4D 变量,然后使用 3D 变量,依此类推。或者你可以像你说的那样添加额外的未使用的填充字节。如果你有太多的非 4D 向量,你可以用 'packoffset' 关键字将它们打包到一个插槽中,以免浪费 GPU 寄存器。详细解释在这里: http://msdn.microsoft.com/en-us/library/windows/desktop/bb509581(v=vs.85).aspx

    【讨论】:

    • 好的,这绝对可以解决一些问题。必须沉浸在信息中。谢谢。
    【解决方案2】:
    1. SimpleVertex 是定义 input 顶点布局的 C++ 端结构。 VS_OUTPUT 是定义顶点着色器输出/像素着色器输入的hlsl侧结构。 SimpleVertex 的布局对应于顶点着色器 input,它是顶点着色器函数 VS(float4 Pos : POSITION, float4 Color: COLOR) 的参数。在 D3D11 中,您使用 ID3D11InputLayout 对象(在 C++ 端)来描述输入顶点布局(SimpleVertex 结构)应如何绑定到顶点着色器输入。如果您在 C++ 源代码中搜索 InputLayout 教程,您将看到它的创建位置。
    2. 您需要考虑与常量缓冲区的对齐。常量缓冲区成员在 float4 边界上对齐,但 C++ 结构不是这样,当您使用 XMFLOAT3 作为方向时,您的 XMFLOAT4 颜色与常量缓冲区在 hlsl 中定义的布局不一致。

    【讨论】:

    • 现在更有意义了。我之前不确定这些结构是如何关联的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多