directx - 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);
在我的着色器代码中取消绑定Texture2D
and而不是只使用and 。RWTexture2D
ID3DX11EffectShaderResourceVariable::SetResource(NULL)
ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView(NULL)
有人可以告诉我的代码可能有什么问题或确认这个问题吗?
解决方案
SetDiffuseMap
不是 Effects 11 方法,所以我不知道它在做什么,但我会假设它SetResource
在某个时候调用。
效果 11 在您调用 之前不会更改设备上的任何内容Apply
,因此调用 set 方法不会更改设备上的任何绑定。
Effects 11 的设计是懒惰地改变性能状态,所以在这些危险警告的情况下,明确地解除绑定实际上是正确的解决方案。
请务必使用托管在GitHub和NuGet上的最新版本的 Effects 11 。弗兰克的书附带的副本很旧。有关差异的一些说明,请参阅wiki和项目自述文件。
请注意,虽然这本书仍然非常有用且相关,但它大量使用了来自旧版 DirectX SDK 的支持库。您可以而且应该避免使用适用于 Direct3D 11 或更高版本的旧版 DirectX SDK。请参阅此博客文章、MSDN和Living without D3DX
推荐阅读
- verilog - 我有一个 Verilog 代码,问题是我需要 C 位与 B_G2 同时变高,这是在 else 语句中完成的
- javascript - LightningChart Js - 在鼠标矩形缩小时触发缩小事件时保持 setInterval
- python - 为用户显示喜欢的帖子 Flask 博客
- regex - SED - 从 HTML 标记中删除属性
- html - Html5 视频在浏览器中滞后
- c# - .NET Core 中的 System.Web.Hosting.HostingEnvironment?
- python - 'key=lambda x: x[1]' 在这里如何工作?
- wordpress - 如何在 woocommerce 管理员端的订单详细信息页面中添加自定义订单备注类型?
- python - 带有单击按钮的 tkinter 定义
- visual-studio - 如何列出 Visual Studio 中给定解决方案的所有项目的所有目标框架?