0

こんにちはみんな、

現在、hlslシェーダーに値を渡そうとしています。ここで、シェーダーの定数バッファーを次に示します。

cbuffer ConstantBuffer
{
    float4x4 final;
    float4x4 rotation;    // the rotation matrix
    float4 lightvec;      // the light's vector
    float4 lightcol;      // the light's color
    float4 ambientcol;    // the ambient light's color
    float3 SPACE;
    float alpha;  // <-- Variable trying to recieve, the first 5 works!
}

そしてc++では:

struct CBUFFER
{
    public:
        D3DXMATRIX Final;
        D3DXMATRIX Rotation;
        D3DXVECTOR4 LightVector;
        D3DXCOLOR LightColor;
        D3DXCOLOR AmbientColor;
        D3DXVECTOR3 SPACE;
        float Alpha;
};

そこで、16ビットのパックで送信できるように変数を調整しようとしました。しかし、シェーダーの変数alphaが設定されていないため、何らかの理由で機能していません。

だから私は何を間違えましたか?(追記:シェーダーの初期化でバッファー幅を192に設定しました)

ありがとうございました

4

2 に答える 2

1

ここでの問題は、バッファ幅が192ではなく208である必要があることです。この場合、cbufferサイズを計算するための合計は次のとおりです。

64(float4x4最終)+ 64(float4x4回転)+ 16(float4 lightvec)+ 16(float4 lightcol)+ 16(float4ambientcol)+ 16(float3 SPACE)+ 16(float alpha)= 208バイト

cbufferの変数は、16バイトのパックにグループ化されます。これは、変数の最小サイズが16バイトであることを意味します。そのため、「float3SPACE」と「floatalpha はそれぞれ16バイトを表します。

「ConstantBuffer」は、16バイトの13パックを占有します(13 * 16 = 208)。


変数をパックすることができます。キーワード「packoffset」を使用すると、2、3、または4つの変数を1つの16バイトパックにパックできます。この場合、「float3SPACE」 floatalpha」をパックすると、cbufferサイズが192に減少します。

cbuffer ConstantBuffer
{
    float4x4 final : packoffset(c0);
    float4x4 rotation : packoffset(c4);
    float4 lightvec : packoffset(c8);
    float4 lightcol : packoffset(c9);
    float4 ambientcol : packoffset(c10);
    float3 SPACE : packoffset(c11); // 'SPACE' is mapped to the first 12 bytes of the 12th pack.
    float alpha : packoffset(c11.w); // 'alpha' is mapped to the last 4 bytes of the 12th pack.
}

これで、cbufferサイズを計算するための合計は次のようになります。

64(float4x4最終)+ 64(float4x4回転)+ 16(float4 lightvec)+ 16(float4 lightcol)+ 16(float4ambientcol)+ 12(float3 SPACE)+ 4(float alpha)= 192バイト

「ConstantBuffer」は16バイトの12パックを占有します(12 * 16 = 192)。

最後に、構造体「CBUFFER」を変更する必要があります。

struct CBUFFER
{
    public:
        D3DXMATRIX Final;
        D3DXMATRIX Rotation;
        D3DXVECTOR4 LightVector;
        D3DXCOLOR LightColor;
        D3DXCOLOR AmbientColor;
        D3DXVECTOR4 SPACE_and_alpha; // SPACE_and_alpha.xyz = SPACE, SPACE_and_alpha.w = alpha

};

詳細なパッキング情報:https ://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v = vs.85).aspx

于 2017-11-10T16:53:16.103 に答える
0

check de Dave awnserは、コンパイラがstructの変数にオフセットを作成して、CPUフェッチでの使用をより高速にする可能性があります。プラグマが機能しない場合は、ピクセルシェーダーステージで直接アルファ値を使用しているかどうかを確認し、正しく定数バッファーを設定します(エフェクトを使用していない場合、頂点シェーダーで設定された定数バッファーはピクセルシェーダーで共有されません)。

于 2012-12-27T15:49:10.217 に答える