0

同じVertexBufferやDeviceContextに、インスタンスごとのテクスチャ、頂点シェーダー、ピクセルシェーダーをどのように実装しますか?

同じタイプのメッシュで異なるピクセルシェーダーを使用するが、色が異なる最も効率的な方法を見つけようとしています。たとえば、頂点バッファ内の正方形モデルと三角形モデルを使用し、頂点/ピクセルなどのシェーダーがインスタンスデータに基づいて異なる動作をするようにします。...(インスタンスデータに何らかの形で「デッド」が含まれている場合、シェーダーはグラデーションではなく、単色で不透明な形状を描画します。

与えられたもの: 1。Vertex Buffer、Square&Trianglのさまざまなモデルテンプレート(最終的には)。

  1. タイプSquareおよび/またはTriangleなどの[n]個のインスタンスを持つインスタンスバッファ。

推測: これを行うために私が調査しようとしていること:

A:HLSLまたはInputAssemblyが描画時に使用するシェーダーを決定できるように、テクスチャ、VertexShader、またはPixelShader IDをバッファーデータに追加できますか?

B.複数のピクセルシェーダーと頂点シェーダーをDeviceContextに「設定」できますか?また、レンダリング時にロードされる頂点シェーダーを「切り替える」ようにDirectXに指示するにはどうすればよいですか?

C.各タイプ(頂点、ピクセル、ハルなど)のシェーダーをいくつ、デフォルトの頂点バッファーのモデル定義/メッシュに関連付けることができますか?

D. HLSLである種のシェーダーセレクターを使用できますか?

関連するC++コード

入力レイアウトを作成するときに、実際のVertex Shaderを指定せずにこれを行うことはできますか、または何らかの方法で複数を指定することはできますか?

NS::ThrowIfFailed(
result = NS::DeviceManager::Device->CreateInputLayout(
NS::ModelRenderer::InitialElementDescription,
2,
vertexShaderFile->Data,
vertexShaderFile->Length,
& NS::ModelRenderer::StaticInputLayout
)
);

VertexShaderとPixelShaderを設定するとき、VertexBufferの特定のモデルにそれらを関連付けるにはどうすればよいですか?それぞれを複数設定することはできますか?

DeviceManager::DeviceContext->IASetInputLayout(ModelRenderer::StaticInputLayout.Get());

DeviceManager::DeviceContext->VSSetShader(ModelRenderer::StaticVertexShader.Get(), nullptr, 0);
DeviceManager::DeviceContext->PSSetShader(ModelRenderer::StaticPixelShader.Get(), nullptr, 0);
4

1 に答える 1

0

HLSL または InputAssembly が描画時に使用するシェーダーを決定できるように、テクスチャ、VertexShader、または PixelShader ID をバッファー データに追加するにはどうすればよいですか?

ピクセル シェーダー ID をバッファーに割り当てることはできません。これは、パイプラインのしくみではありません。

A / デバイス コンテキストで一度に 1 つの頂点/ピクセル シェーダーのみをバインドできます。これによりパイプラインが定義され、このシェーダーを使用してジオメトリを描画し、必要に応じて別の頂点/ピクセル シェーダーに切り替え、次のジオメトリを描画します...

B/ 同じモデルを使用して異なるシェーダーを使用できますが、それは VSSetShader、PSSetShader を使用して CPU で行われます....

C/いいえ、B と同じ理由で (シェーダーは CPU に設定されています)

入力レイアウトを作成するとき、実際の Vertex Shader を指定せずにこれを行うことはできますか、または何らかの形で複数指定できますか?

頂点シェーダーを指定しない場合、パイプラインは「null」ジオメトリを描画すると見なします。これは実際に可能です (そして非常に楽しい) が、コンテキストから少し外れています。ジオメトリを提供する場合は、頂点シェーダー データを送信する必要があります。そのため、ランタイムはジオメトリ レイアウトを頂点入力レイアウトに一致させることができます。もちろん、関数を数回呼び出すことで複数の入力レイアウトを作成できます (最悪の場合、頂点シェーダー/ジオメトリごとに 1 回ですが、2 つのモデル/頂点シェーダーが同じレイアウトを持っている場合は省略できます)。

VertexShader と PixelShader を設定するとき、それらを VertexBuffer の特定のモデルに関連付けるにはどうすればよいですか? それぞれ複数設定することはできますか?

必要なものすべて (Vertex/Pixel シェーダー、Vertex/IndexBuffer、入力レイアウト) をバインドし、draw (または drawinstanced) を呼び出します。

于 2013-01-29T16:41:08.303 に答える