人。
定数バッファーを介してfloat配列を頂点シェーダー(HLSL)に渡す際に問題が発生します。以下の配列の各「float」は、HLSLパッキングルールにより、16バイトのスロット(float4に相当するスペース)をすべて単独で取得することを知っています。
// C++ struct
struct ForegroundConstants
{
DirectX::XMMATRIX transform;
float bounceCpp[64];
};
// Vertex shader constant buffer
cbuffer ForegroundConstantBuffer : register(b0)
{
matrix transform;
float bounceHlsl[64];
};
(残念ながら、ここでの単純な解決策は機能しません。その変更を行った後は何も描画されません)
C ++データが渡される間、パッキングルールにより、 bounceCppC ++配列の各「float」がbounceHlsl配列の16バイトスペースに単独で入るように間隔が空けられます。これにより、次のような警告が発生しました。
ID3D11DeviceContext :: DrawIndexed:頂点シェーダーユニットのスロット0にある定数バッファーのサイズが小さすぎます(320バイトが提供され、少なくとも1088バイトが必要です)。範囲外の読み取りは0を返すように定義されているため、これは問題ありません。開発者は、欠落しているデータがとにかく使用されないことを知っている可能性もあります。これは、開発者が実際にシェーダーが期待するものに対して十分に大きな定数バッファーをバインドすることを意図した場合にのみ問題になります。
こことここで指摘されているように、HLSL定数バッファーを次のように書き直すことをお勧めします。
cbuffer ForegroundConstantBuffer : register(b0)
{
matrix transform;
float4 bounceHlsl[16]; // equivalent to 64 floats.
};
static float temp[64] = (float[64]) bounceHlsl;
main(pos : POSITION) : SV_POSITION
{
int index = someValueRangeFrom0to63;
float y = temp[index];
// Bla bla bla...
}
しかし、それは機能しませんでした(つまり、ID3D11Device1 :: CreateVertexShaderは返されません)。Shader Model 4 Level 9_1に対してコンパイルしていますが、ここで間違ったことを見つけられますか?
前もって感謝します!:)
よろしく、ベン