0

Direct3D では、好きなタイプの頂点を作成できます。位置情報だけの単純な Vertex を持つことも、色情報、テクスチャ情報などを追加することもできます。入力レイアウトを作成するときは、Vertex のどの部分を実装したかを定義します。

D3D10_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0 },
};

私の質問は、すべての入力タイプ (位置、色、テクスチャなど) で頂点構造を定義する必要があるかどうかです。または、それぞれ異なるタイプの入力を持ついくつかの頂点構造を作成する必要があります。

複数のクラスを使用することの欠点は、いくつかのクラスを作成して維持する必要があり、使用する頂点のタイプを理解するのが混乱する可能性があることです。頂点構造が 1 つの場合の欠点は何ですか?

4

3 に答える 3

1

そうしないで、特殊な構造を使用してください。頂点データを GPU にアップロードすると、多くの帯域幅が消費され、すぐにボトルネックになります (問題を解決するのは簡単であるため、Vertexbuffer をカスタム クラスでラップして、最も効率的な入力レイアウトへの変換を自動的に処理します)。

また、実用的ではありません。たとえば、スキニングには、頂点ごとに多くの余分なデータが必要です。アプリケーション内のすべての頂点が、まったく必要ないにもかかわらず、それを保持することを本当に望んでいますか?

ただし、頂点コンポーネントがデータ構造に現れる順序について何らかの規則を確立することをお勧めします。これらは最終的に頂点入力レイアウトに結合されるため、シェーダーを作成するのに役立ちます。

于 2010-10-08T08:32:47.907 に答える
1

未使用の頂点データを 3D アクセラレータにアップロードすると、帯域幅が消費されます。一流のビデオ ゲームをプレイしている場合を除き、それほど重要ではありません (ほぼ確実に別の場所でボトルネックが発生します)。

于 2010-10-07T10:12:10.500 に答える
0

ヒープ上にメモリのチャンクを生成し、必要な要素のみで埋めることで解決しました。コードはここから入手できます:

http://code.google.com/p/woof/source/browse/trunk/Libraries/WOOF3D/Direct3D10Vertices.cpp?r=24

于 2010-10-08T08:27:31.177 に答える