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



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

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]

当我使用计算着色器时,也会发生这种情况。我不得不使用:

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

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

效果 11 在设计上懒于更改性能状态,因此在这些危险警告的情况下,像您正在执行的那样显式解除绑定实际上是正确的解决方案。

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

请注意,虽然这本书仍然非常有用且相关,但它大量使用了旧版 DirectX SDK 中的支持库。你可以并且应该避免使用适用于 Direct3D 11 或更高版本的旧版 DirectX SDK。请参阅此博客文章、MSDN 和没有 D3DX 的生活

最新更新