ID3DX11EffectShaderResourceVariable::SetResource(NULL) 无法解绑资源

ID3DX11EffectShaderResourceVariable::SetResource(NULL) can't unbind resources

当我尝试使用 DirectX 11 进行 3D 游戏编程简介的第 12 章中的练习 4 时出现问题。在我的代码中,我尝试将纹理的 SRV 绑定到 [=32] 中的 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);

取消绑定我的着色器代码中的 Texture2DRWTexture2D 而不是仅使用 ID3DX11EffectShaderResourceVariable::SetResource(NULL)ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView(NULL).

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

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

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

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

请务必使用 GitHub and NuGet. The copy that came with Frank's book is quite old. For some notes on the differences, see the wiki 上托管的最新版本的 Effects 11 和项目自述文件。

Note that while that book is still quite useful and relevant, it makes heavy use of support libraries from the legacy DirectX SDK. You can and should avoid using the legacy DirectX SDK for Direct3D 11 or later. See this blog post, MSDN, and Living without D3DX