D3D10 HLSL:如何通过反射将纹理绑定到全局Texture2D?

时间:2010-07-07 21:17:33

标签: c++ directx hlsl shader direct3d10

好的,假设我在着色器的某个地方有如下声明(注意我正在启用传统支持以在DX9和DX10之间共享着色器):

Texture2D   DiffuseMap;

我可以编译着色器而没有任何问题,但我对于如何将ShaderResourceView绑定到“DiffuseMap”有点遗憾。当我“反映”着色器时,我宁愿假设它会在常量缓冲区中的变量中出现。它没有。事实上,我似乎无法在任何地方识别它。那么我怎么知道我应该绑定ShaderResourceView的纹理“stage”(使用DX9术语)呢?

编辑:我发现我可以使用“GetResourceBindingDesc”来识别采样器名称。我不确定这对我有什么帮助:(

Edit2:同样我没有注意到它在DX9下也是如此......即我只能得到采样器。

Edit3:我的Texture2D和Sampler如下所示:

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

现在在效果框架中,我可以通过语义“DiffuseTexture”获得Texture2D。然后,我可以将ResourceView(D3D10)/纹理(D3D9)设置为Texture2D。唉似乎没有任何方法可以使用沼泽标准着色器来处理“语义”(知道D3D如何做到这一点很棒但是研究D3D11效果框架到目前为止我无处可去。它似乎在阅读它在二进制文件中,即已编译的数据,我自己只能看到“DiffuseSampler”。

1 个答案:

答案 0 :(得分: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代表ppShaderResourceViews相关SRV在*SetShaderResources调用的pDesc.Name数组中的位置。 {{1}}(如“DiffuseMap”)为您提供关联信息。