3

私にはちょっとした難問があり、それが私を困惑させています。次のような頂点タイプがすべて異なるシェーダーがいくつかあるとします。

// light shader
struct vertexInputType
{
    float4 position : POSITION;
    float2 tex : TEXCOORD0;
    float3 normal : NORMAL;
};

// color shader
struct vertexInputType
{
    float4 position : POSITION;
    float4 color : COLOR;
};

// bump mapping shader
struct vertexInputType
{
    float4 position : POSITION;
    float2 tex : TEXCOORD0;
    float3 normal : NORMAL;
    float3 binormal : BINORMAL;
    float3 tangent : TANGENT;
};

ここで、このすべてのデータが利用可能なモデルがあるとします。データがすべてのデータに対して正しくレイアウトされていないため、すべてを同じバッファーに入れ、選択した 3 つすべてでレンダリングすることは正確にはできません。これを可能にするオプションは 2 つしかありませんが、どちらも同じように苦痛です。

1) RAM にすべてのデータを保持する大きなバッファーを用意し、すべての描画呼び出しで、シェーダー オブジェクトから頂点の種類を取得し、正しい情報で新しい頂点バッファーを作成します。ご覧のとおり、これは恐ろしく遅くなります。

また...

2) モデルの初期化時に複数の ID3D11Buffers を作成できます。1 つのバッファーには位置と色があり、1 つには位置、texcoord、および法線があり、1 つには位置、texcoord、法線、従法線、および接線があり、必要な数のバッファーもあります。モデルが情報を持っているその他の頂点タイプの場合。比較すると、これは利用可能な vram を消去し、これもノーゴにします。

これを行う他の方法は見当たりません。他の d3d 関係者はこれをどのように行っていますか?

4

2 に答える 2

2

DX11のコンテキストでこれについて尋ねているのは良いことです。ID3D11InputLayoutは、この概念を以前のバージョンから大幅に簡素化します。CreateInputLayoutを使用して、頂点データの複数のレイアウト (上記で提供した構造体ごとに 1 つ) を作成し、同じ頂点バッファーを別の方法で解釈したいポイントで正しいレイアウトでIASetInputLayoutを呼び出すことができます。

編集: Input-Layout オブジェクトの作成例については、こちらを参照してください。

お役に立てれば!

于 2012-07-16T16:00:22.783 に答える
1

秘訣は、データをストリーム (P、T、A) に分割することです。

ストリーム P には、位置と法線が含まれています。このデータは、頂点をライティングでレンダリングするために必要です。従法線と頂点カラー データを含めることもできます。

ストリーム T にはテクスチャ情報が含まれているため、最大 8 つの TU チャネルにすることができます。GPU バスを介して空のチャネルをコピーすることでメモリ帯域幅が浪費されないように、このストリームでエンコードされているチャネルの数を保存するように注意する必要があります。

ストリーム A には、アニメーション情報、ボーン ウェイトなどが含まれます。

レンダリング パイプラインのアーキテクチャに応じて、チャネルの数を増減できます。ここでの秘訣は、FVF を使用してデータ レイアウトを動的に定義することです。このアーキテクチャの利点の 1 つは、最適なメモリ帯域幅の使用です。これは、複数のレンダー パスが必要な場合に特に関連しますが、各パスにすべてのデータが必要なわけではありません。

于 2012-07-16T15:58:42.550 に答える