使用ID3DXEffect-> SetTexture解绑绑定纹理

时间:2012-12-25 21:25:59

标签: c++ directx-9 d3dx

使用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。这也很难看。

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

1 个答案:

答案 0 :(得分:1)

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

我认为这种解决方案在这种情况下是最不丑的。但是,您总是可以编写自己的效果类(这非常简单btw)。

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