c++ - 使用 ID3DXEffect->SetTexture 取消绑定(bind)纹理

标签 c++ directx-9 d3dx

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

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

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

Direct3D9: (WARN) :Can not render to a render target that is also used as a texture. A render target was detected as bound, but couldn't detect if texture was actually used in rendering.



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

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

    最佳答案

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

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

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

    关于c++ - 使用 ID3DXEffect->SetTexture 取消绑定(bind)纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034101/

    相关文章:

    c++ - D3DX11SaveTextureToFile 与 ID3D11ShaderResourceView

    crash - DirectX 应用程序导致计算机崩溃

    c++ - 在 C++ 中将指针转换为 volatile void**

    c++ - 直线运动卡顿

    c++ - 为什么c++ pthread会自行退出而不导致进程崩溃?

    c++ - 如何使用 Microsoft 的 IDirectInputDevice8 在 C++ 中使用 Joystick 代码?

    c++ - 无法创建 d3d 设备

    installation - 如何模拟 "clean PC"进行应用程序D3DX redist安装测试?

    c++ - 如何将程序变成守护程序

    c++ - 稳定的时间戳数据流的数据结构