2

シェーダー プログラミングを理解しようとしていますが、現時点ではドキュメントは役に立ちません。

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 に変更すると、機能することが偶然わかりました。私は何を理解していませんか?なぜ私は私が望むタイプを持つことができないのですか?

読んでくれてありがとう。

4

2 に答える 2

2

1-構造体の名前からわかるように、これは入力ではなく、頂点シェーダーの出力です。バーテックスシェーダーは、位置変数を4つのフロート(同次座標)として出力する必要があります。したがって、シェーダーファイルのどこかに、ベクトルをfloat4変数( "float4(inputPos、1.0);"など)に展開する操作が必要です。

2-おそらくアライメントの問題です。GPUは、4Dベクトルで動作するように設計されています。定数バッファーを使用している間は、最初に行列、2番目に4D変数、3番目に3D変数などを使用して構造を作成してみてください。または、あなたが言ったように、未使用のパディングバイトを追加することもできます。4D以外のベクトルが多すぎる場合は、GPUレジスタを無駄にしないために、「packoffset」キーワードを使用してそれらを1つのスロットにパックできます。詳細な説明はここにあります:http: //msdn.microsoft.com/en-us/library/windows/desktop/bb509581 (v = vs.85).aspx

于 2012-10-15T18:33:49.633 に答える
1
  1. SimpleVertex は、入力頂点のレイアウトを定義する C++ 側の構造体です。VS_OUTPUT は、頂点シェーダー出力/ピクセル シェーダー入力を定義する hlsl 側の構造体です。SimpleVertex のレイアウトは、頂点シェーダー関数 VS(float4 Pos : POSITION, float4 Color: COLOR) への引数である頂点シェーダー入力に対応します。D3D11 では、ID3D11InputLayout オブジェクト (C++ 側) を使用して、入力頂点レイアウト (SimpleVertex 構造体) を頂点シェーダー入力にバインドする方法を記述します。C++ ソース コードで InputLayout のチュートリアルを検索すると、これが作成された場所がわかります。
  2. 定数バッファーとのアライメントを考慮する必要があります。定数バッファー メンバーは float4 境界で整列されますが、C++ 構造体はそうではありません。方向に XMFLOAT3 を使用すると、XMFLOAT4 の色が、定数バッファーが hlsl で定義するレイアウトと一致しません。
于 2012-10-15T18:34:15.233 に答える