2

わかりましたので、シェーダーのどこかに次のようなステートメントがあると仮定します (DX9 と DX10 の間でシェーダーを共有するためのレガシー サポートを有効にしていることに注意してください)。

Texture2D   DiffuseMap;

問題なくシェーダーをコンパイルできますが、ShaderResourceView を "DiffuseMap" にバインドする方法について少し迷っています。シェーダーを「リフレクト」するとき、定数バッファー内の変数の中で現れると思いました。そうではありません。実際、私はそれをどこにも特定できないようです。では、ShaderResourceView もバインドする必要があるテクスチャの「ステージ」(DX9 用語を使用) をどのように知ることができるでしょうか?

編集:「GetResourceBindingDesc」を使用してサンプラー名を識別できることを発見しました。それが私をまったく助けてくれるかどうかはわかりません:(

Edit2: 同様に、DX9 でも同じであることに気付きませんでした。つまり、サンプラーしか入手できません。

Edit3: 私の Texture2D とサンプラーは次のようになります。

Texture2D DiffuseMap  : DiffuseTexture;
sampler   DiffuseSampler  = sampler_state
{
    Texture   = (DiffuseMap);
    MinFilter = Linear;
    MaxFilter = Linear;
};

これで、エフェクト フレーム作業で、セマンティック「DiffuseTexture」によって Texture2D を取得できました。その後、ResourceView(D3D10)/Texture(D3D9) を Texture2D に設定できます。残念ながら、沼地の標準シェーダーを使用して「セマンティクス」を処理する方法はないようです (D3D がどのようにそれを行うかを知ることは素晴らしいことですが、D3D11 効果フレームワークを研究しても、これまでのところどこにも行きませんでした。それを読んでいるようですバイナリ、つまりコンパイルされたデータから出て、そこには「DiffuseSampler」しか見えません)。

4

1 に答える 1

1

うーん、言い換えさせてください。C++ 側には、読み込まれたテクスチャと関連する SRV がたくさんあります。ここで、シェーダー (DX9 に由来) を設定し、シェーダーがどのように記述されているかを確認せずに、SRV をバインドします (拡散から拡散スロット、スペキュラー、法線マップなど、名前を付けます)。右?

次に、あなたが言ったように、最善の策は次を使用していると思いますGetResourceBindingDesc

HRESULT GetResourceBindingDesc(
  [in]  UINT ResourceIndex,
  [in]  D3D10_SHADER_INPUT_BIND_DESC *pDesc
);

それぞれを反復する必要があると思いますResourceIndex(0 から始まり、1、2 など)。そうであればHRESULTS_OK呼び出しの配列でpDesc.BindPoint関連する SRV の位置を表します。そして(「DiffuseMap」のように)関連付け情報を提供します。ppShaderResourceViews*SetShaderResourcespDesc.Name

于 2010-07-08T09:41:39.933 に答える