5

人。

定数バッファーを介して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に対してコンパイルしていますが、ここで間違ったことを見つけられますか?

前もって感謝します!:)

よろしく、ベン

4

1 に答える 1

3

最適ではありませんが、解決策の 1 つは、float 配列を次のように宣言することです。

float4 bounceHlsl[16];

次に、次のようにインデックスを処理します

float x = ((float[4])(bounceHlsl[i/4]))[i%4];

ここで、i は必要なインデックスです。

于 2013-02-07T13:25:53.963 に答える