シェーダー プログラミングを理解しようとしていますが、現時点ではドキュメントは役に立ちません。
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 に変更すると、機能することが偶然わかりました。私は何を理解していませんか?なぜ私は私が望むタイプを持つことができないのですか?
読んでくれてありがとう。