2

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

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,它就可以工作。我不明白什么?为什么我不能拥有我想要的类型?

谢谢阅读。

4

2 回答 2

2

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

于 2012-10-15T18:33:49.633 回答
1
  1. SimpleVertex 是定义输入顶点布局的 C++ 端结构。VS_OUTPUT 是定义顶点着色器输出/像素着色器输入的 hlsl 侧结构。SimpleVertex 的布局对应于顶点着色器输入,它是顶点着色器函数 VS(float4 Pos : POSITION, float4 Color: COLOR) 的参数。在 D3D11 中,您使用 ID3D11InputLayout 对象(在 C++ 端)来描述输入顶点布局(SimpleVertex 结构)应如何绑定到顶点着色器输入。如果您在 C++ 源代码中搜索 InputLayout 教程,您将看到它的创建位置。
  2. 您需要考虑与常量缓冲区的对齐。常量缓冲区成员在 float4 边界上对齐,但 C++ 结构不是这样,当您使用 XMFLOAT3 作为方向时,您的 XMFLOAT4 颜色与常量缓冲区在 hlsl 中定义的布局不一致。
于 2012-10-15T18:34:15.233 回答