8

このコードを使用して、1 つのテクスチャをシェーダーに送信できます。

 devcon->PSSetShaderResources(0, 1, &pTexture); 

もちろん、pTexture は次の方法で作成しました: D3DX11CreateShaderResourceViewFromFile

シェーダー: Texture2D テクスチャ;

return color * Texture.Sample(ss, texcoord);

現在、シェーダーにテクスチャを 1 つしか送信していませんが、複数のテクスチャを送信したいのですが、どうすれば可能ですか?

ありがとうございました。

4

2 に答える 2

21

シェーダープロファイルの仕様を超えない限り、複数のテクスチャを使用できます。次に例を示します。HLSLコード:

Texture2D diffuseTexture : register(t0);
Texture2D anotherTexture : register(t1);

C ++コード:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture);

したがって、たとえば上記のHLSLコードの場合、次のようになります。

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV);
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View)

また:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV};
devcon->PSSetShaderResources(0, 2, &textures);

HLSL名は任意であり、特定の名前に対応する必要はありません。重要なのはインデックスのみです。「register(tXX);」の間 ステートメントは必須ではありません。どのテクスチャがどのスロットに対応するかについて混乱を避けるために、ステートメントを使用することをお勧めします。

于 2012-07-26T17:08:26.950 に答える
8

テクスチャ配列を使用する。あなたがメンバーD3D11_TEXTURE2D_DESCを見て記入するとき。ArraySizeこの desc 構造体は、 に渡されるものID3D11Device::CreateTexture2Dです。次に、シェーダーで、配列内のどの 2D テクスチャを参照しているかを示す 3 番目の texcoord サンプリング インデックスを使用します。

更新:複数の呼び出し (つまり、異なるジオに対して) でそれを行うことについて話している可能性があることに気付きました。その場合、シェーダーのテクスチャ リソース ビューを更新します。エフェクト フレームワークを使用している場合は、 ID3DX11EffectShaderResourceVariable::SetResourceを使用するか、代わりに を使用して新しいテクスチャを再バインドPSSetShaderResources。ただし、複数のテクスチャをブレンドしようとしている場合は、テクスチャ配列を使用する必要があります。

また、texcoord の 3 番目の要素を介して配列内の隣接するテクスチャ間を補間する自然な方法を提供する 3D テクスチャを調べることもできます (2D 配列は最も近い整数に自動的にクランプされます)。HLSL のsample 注釈を参照してください。

于 2012-07-26T11:27:52.170 に答える