【问题标题】:Unbind texture bound using ID3DXEffect->SetTexture使用 ID3DXEffect->SetTexture 取消绑定纹理
【发布时间】:2013-01-11 00:01:10
【问题描述】:

我在使用 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。这也太丑了。

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

【问题讨论】:

    标签: c++ directx-9 d3dx


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2011-07-13
      • 2015-02-26
      • 2015-04-09
      • 1970-01-01
      相关资源
      最近更新 更多