2

モデルを持っているとしましょう。このモデルには、位置、色、法線、および2つのテクスチャ座標のデータがあります。ここで、入力タイプが位置と色のみであるシェーダーがあるとします。ただし、このモデルの頂点バッファは次の形式です。

struct Vertex_PCNT2
{
    D3DXVECTOR3 position;
    D3DXVECTOR4 color;
    D3DXVECTOR3 normal;
    D3DXVECTOR2 tex1;
    D3DXVECTOR2 tex2;
};

このモデルには、位置と色を取得するシェーダーの情報が含まれていますが、余分なデータがあるため、使用できません。私が考えることができる他の唯一の解決策は、同じ情報からいくつかのフィールドを除いた複数の頂点バッファを持つことですが、それは単に冗長です。真剣にもっと良い方法がなければなりません。ここで何か助けはありますか?

編集:仕事の前に少し時間をかけて質問を詳しく説明すると思いました。頂点バッファーについて話すとき、私はID3D11Device::CreateBufferで作成するID3D11Buffer*を意味します。手前に、Vertex_PCNT2と入力して頂点の配列を埋めます。この時点で私が言えることから、そのバッファーは永続的にこの形式になっているため、すべてのシェーダーがこの形式で動作する必要があります。データがすでに存在する場合、他のバッファを設定することはRAMに負担をかけるだけです。

4

1 に答える 1

3

通常、これは同じ頂点バッファに対して異なるInputLayoutを作成することによって行われます。InputLayoutは、頂点入力データと頂点シェーダーの予想される入力の間のフィルターされたビューとして機能できることに注意してください。

InputLayoutは、この種のシナリオに対して正確に実行されます。これは基本的に、元のデータのレイアウトと頂点シェーダー入力へのバインディングのレイアウトを分離しています。

たとえば、位置と色をマッピングするだけでよい場合は、正しいAlignedByteOffsetが設定された2つのD3D11_INPUT_ELEMENT_DESC要素の配列を使用して入力レイアウトをインスタンス化する必要があります。

「POSITION」(オフセット0)と「COLOR」(バイト単位のオフセット:12)のみを選択した場合:

D3D11_INPUT_ELEMENT_DESCレイアウト[]=
{{
{"POSITION"、0、DXGI_FORMAT_R32G32B32_FLOAT、0、0、D3D11_INPUT_PER_VERTEX_DATA、0}、
{"COLOR"、0、DXGI_FORMAT_R32G32B32A32_FLOAT、0、12、D3D11_INPUT_PER_VERTEX_DATA、0}、
};

ただし、「POSITION」(オフセット0)と「NORMAL」(オフセット28)だけを選択することもできます。

D3D11_INPUT_ELEMENT_DESCレイアウト[]=
{{
{"POSITION"、0、DXGI_FORMAT_R32G32B32_FLOAT、0、0、D3D11_INPUT_PER_VERTEX_DATA、0}、
{"NORMAL"、0、DXGI_FORMAT_R32G32B32A32_FLOAT、0、28、D3D11_INPUT_PER_VERTEX_DATA、0}、
};
于 2012-08-30T12:12:05.907 に答える