2012-09-29 40 views
7

私はちょっと混乱しています。あなたにいくつかのアイデアを明確にするのを手伝ってもらいたいと思っています。ShaderでのDirectX Shaderリソースビュー

HLSLシェーダ(例えば、計算シェーダ)では、StructuredBuffer sbを宣言できますか?私はそれを次のようなレジスタにバインドしなければなりません:register(t0)?

アプリケーション側からは、CSSetShaderResources(...)を呼び出すことができます。最初の引数(StartSlot)は、レジスタ宣言の "t"の後ろにある小さな数字と何か関係がありますか?

StartSlotを0(たとえば)に設定し、2番目の引数を2に設定すると、2つのShaderリソースビューをバインドすることをAPIに指示します.1つはレジスタ(t0)に、もう1つはレジスタ(t1)?

Texture2D tex [10]を宣言した場合:register(t0)CSSetShaderResources(0、10、...)を呼び出して設定できます。これは、レジスタ(t0〜t9)がすべて使い果たされていることを意味しますか?

任意の助けをいただければ幸いです質問のように、「急速な火」のため申し訳ありませんが、私は本当に困惑していると私のテストのいくつかはconfliting結果を与えるように見える...

答えて

4

それでは、順番に返信しましょう:

はい、あなたはもちろん、(実際には、シェーダのいずれかのタイプのためにそれを宣言することができます)コンピュートシェーダでStructuredBufferを宣言することができます。

エフェクトフレームワーク(テクニック)を使用しない場合は、レジスタを宣言する必要があります。シェーダはデータから読み込む場所を知ります(エフェクトフレームワークを使用するだけですが、明示的に宣言する)。

CSSetShaderResourcesは、開始スロットからN個のリソースをバインドするように指示します。したがって、0,2を使用する記述は正しいです。

テクスチャの配列については、PIXを実行して確認する必要がありましたが、確かにあなたが言った方法です。

Texture2D tex[10] : register(t0); 

は、各テクスチャインデックスが登録あなたが指定したので、あなたがそれらを設定するためにCSSetShaderResources(0,10、srvarray)を呼び出す必要があるから始まるスロットが割り当てられることを意味します。

+1

どうもありがとうございました。これは多くのことをクリアします... Texture2D tex [10]:register(t0)では、レジスタ(t1)またはレジスタ(t2)を使って別の変数を宣言することはできません。それらはすべて使い果たされるため、登録(t9)しますか? (私はあなたに+1を与えました、非常に明示的な答え、もう一度ありがとう、私はこの最後の小さなポイントをクリアした後に受け入れられるとマークします) – l3utterfly

+0

同じレジスタにいくつかの変数をバインドしようとするなら、コンパイラはこのエラーを "重複しているレジスタセマンティクスはまだ実装されていません"とします。 – catflier

+0

ありがとうございます。受け入れられた答え。 – l3utterfly

2

非常にクールな説明!私も混乱してしまいました。あなたの質問と説明の後、私にとっては明らかです!

しかし私はこの投稿の良い例を見つけました。これは分かち合いたいと思います。それはすべてのSetShaderResourcesタイプのスロットのカウンタを開始するようです。すべてのシェーダ(VS、HS、DS、PS)には独自のカウンタがあるようです。ここでNVidiaの例からコード:

Shaderclassコード:

pd3dDeviceContext->HSSetShaderResources(0, 2, Resources); 
pd3dDeviceContext->HSSetShaderResources(8, 1, &m_pRegularWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(9, 1, &m_pQuadWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->DSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(10, 1, &pNormalMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(3, 1, &pTexRenderRV11); 

最初の2つのリソースを保持しているので、次のスロットであり(ライン4)は、出発スロット(0 + 2のために2を追加しなければなりません= 2)。すべてのSetShaderResourcesは0から始める必要がありますが、コード内の別の場所で行うことができます。したがって、ここにはDSとPSのスロットはありません。行を削除してもそれはまだ動作しますが、データは延期されることがあります。 HLSLの最初の4行がt0、t1、t8、t9の行に表示され、他のレジスタは別の場所にバインドされています。

HLSLコード:

Texture2D<float> GregoryStencil    : register(t0); 
Texture2D<uint> Index      : register(t1);  
Texture2D<float> g_txHeight     : register(t2);  
Texture2D<float> g_depth      : register(t3); 
Texture2D g_FloorTexture      : register(t4); 
Texture2D<float3> regularPatchControlPoints : register(t5); 
Texture2D<float3> gregoryPatchControlPoints : register(t6); 
Texture2D<float4> g_floorHeight    : register(t7); 
Texture2D<float2> RegularWatertightUVs  : register(t8); 
Texture2D<float2> QuadWatertightUVs   : register(t9); 
Texture2D<float3> g_txNormal     : register(t10); 
関連する問題