首页 > 解决方案 > ID3DX11EffectShaderResourceVariable::SetResource(NULL) 无法解除资源绑定

问题描述

当我尝试在 DirectX 11 的 3D 游戏编程简介中的第 12 章中实施练习 4 时,出现了问题。在我的代码中,我尝试将纹理的 SRV 绑定到Texture2D.fx代码中。之后,我使用了:

Effects::BasicFX->SetDiffuseMap(NULL);

取消绑定资源,但似乎它没有完成工作。我不得不补充:

ID3D11ShaderResourceView* srvs[] = { NULL };
dc->PSSetShaderResources(0, 1, srvs);

或者调试输出一直警告我如下:

D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 0 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]

这种情况也发生在我使用 Compute Shader 的时候。我不得不使用:

ID3D11UnorderedAccessView* uavs[] = { NULL };
UINT initCounts[] = { -1 };
dc->CSSetUnorderedAccessViews(0, 1, uavs, initCounts);

ID3D11ShaderResourceView* srvs[] = { NULL };
dc->CSSetShaderResources(0, 1, srvs);

在我的着色器代码中取消绑定Texture2Dand而不是只使用and 。RWTexture2DID3DX11EffectShaderResourceVariable::SetResource(NULL)ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView(NULL)

有人可以告诉我的代码可能有什么问题或确认这个问题吗?

标签: directxdirectx-11

解决方案


SetDiffuseMap不是 Effects 11 方法,所以我不知道它在做什么,但我会假设它SetResource在某个时候调用。

效果 11 在您调用 之前不会更改设备上的任何内容Apply,因此调用 set 方法不会更改设备上的任何绑定。

Effects 11 的设计是懒惰地改变性能状态,所以在这些危险警告的情况下,明确地解除绑定实际上是正确的解决方案。

请务必使用托管在GitHubNuGet上的最新版本的 Effects 11 。弗兰克的书附带的副本很旧。有关差异的一些说明,请参阅wiki和项目自述文件。

请注意,虽然这本书仍然非常有用且相关,但它大量使用了来自旧版 DirectX SDK 的支持库。您可以而且应该避免使用适用于 Direct3D 11 或更高版本的旧版 DirectX SDK。请参阅此博客文章MSDNLiving without D3DX


推荐阅读