2

好的,假设我在着色器的某处有如下声明(注意我启用了旧版支持以在 DX9 和 DX10 之间共享着色器):

Texture2D   DiffuseMap;

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

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

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

Edit3:我的 Texture2D 和 Sampler 看起来像这样:

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 等),如果HRESULT是,S_OK那么您pDesc.BindPoint将代表关联 SRV 在调用ppShaderResourceViews数组中的位置。*SetShaderResources并且pDesc.Name(如“DiffuseMap”)为您提供关联信息。

于 2010-07-08T09:41:39.933 回答