我正在尝试了解着色器编程,但在这一点上,文档不会进一步帮助我。
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,它就可以工作。我不明白什么?为什么我不能拥有我想要的类型?
谢谢阅读。