1

在使用 FX 框架将纹理绑定到使用 FX 框架的采样器时,我遇到了一些问题:

ID3DXEffect->SetTexture(FXShadowtex,Lights->sunlight->ShadowTex)

一旦该纹理绑定到采样器,我就不能再次渲染它(比如说,当太阳改变位置时)。当我这样做时,会出现以下错误:

Direct3D9:(警告):无法渲染到也用作纹理的渲染目标。渲染目标被检测为绑定,但无法检测纹理是否实际用于渲染。

但是,我不知道如何使用 FX 框架或其他任何可靠的方法“取消设置”纹理。我尝试了几件事:

  • ID3DXEffect->SetTexture(FXShadowtex,NULL)。这会导致崩溃。
  • ID3DXEffect->SetTexture(FXShadowtex,SomeDummy)。这真的很丑。
  • 编译后找出与fx文件中定义的采样器对应的采样器索引,并将其设置为NULL:IDirect3DDevice9->SetTexture(i,NULL)。这显然不是很实用。
  • 忘记警告。由于无休止的垃圾邮件,这使得 D3D 调试输出毫无用处,而且非常难看。
  • 在进行任何渲染之前,从零循环到 fx 文件中定义的采样器数量,并将它们全部设置为 NULL。这也太丑了。

还有其他我忘记的方法吗?解释为什么上述任何“解决方案”都是必要的邪恶也很好。:)

4

1 回答 1

2

找出哪个纹理单元绑定到该采样器制服(请参阅 msdn 上的 ID3DXEffect 类),然后简单地使用 IDirect3DDevice9::SetTexture() 取消设置纹理。

我认为这个解决方案在这种情况下是最不难看的。但是,您始终可以编写自己的效果类(顺便说一句,这非常简单)。

使用例如D3DXCompileShaderFromFile然后您可以遍历返回的常量表并使用IDirect3DDevice9::SetPixelShaderConstantF设置统一值。请注意,在这种情况下,矩阵被设置为列优先(这意味着您必须在着色器中从左侧乘以向量)。一个有效的解决方案是为常量分配一个连续的空间并在一次调用中设置它们。

于 2013-01-10T15:46:21.703 回答