好的,假设我在着色器的某个地方有如下声明(注意我正在启用传统支持以在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”。
答案 0 :(得分:1)
然后我想你最好的选择就是使用GetResourceBindingDesc
:
HRESULT GetResourceBindingDesc(
[in] UINT ResourceIndex,
[in] D3D10_SHADER_INPUT_BIND_DESC *pDesc
);
我认为你必须迭代每个ResourceIndex
(从0开始,然后是1,2等),如果HRESULT
是S_OK
那么你有pDesc.BindPoint
代表ppShaderResourceViews
相关SRV在*SetShaderResources
调用的pDesc.Name
数组中的位置。 {{1}}(如“DiffuseMap”)为您提供关联信息。