当我尝试使用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]
当我使用Compute Shader时,也会发生这种情况。我必须使用:
ID3D11UnorderedAccessView* uavs[] = { NULL };
UINT initCounts[] = { -1 };
dc->CSSetUnorderedAccessViews(0, 1, uavs, initCounts);
ID3D11ShaderResourceView* srvs[] = { NULL };
dc->CSSetShaderResources(0, 1, srvs);
取消绑定着色器代码中的Texture2D
和RWTexture2D
,而不仅仅是使用ID3DX11EffectShaderResourceVariable::SetResource(NULL)
和ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView(NULL)
。
有人可以告诉我代码有什么问题或确认此问题吗?
答案 0 :(得分:0)
SetDiffuseMap
不是Effects 11方法,所以我不知道它在做什么,但是我假设它在某个时刻调用SetResource
。
在调用Apply
之前,效果11不会更改设备上的任何内容,因此调用set方法不会更改设备上的任何绑定。
设计效果11懒惰地更改性能状态,因此在这些危险警告的情况下,在执行操作时显式解除绑定实际上是正确的解决方案。
请确保使用GitHub和NuGet上托管的最新版的Effect 11。弗兰克的书随附的副本很旧。有关差异的一些说明,请参见wiki和项目自述文件。
请注意,尽管该书仍然非常有用且相关,但大量使用了旧版DirectX SDK中的支持库。您可以并且应该避免将旧版DirectX SDK用于Direct3D 11或更高版本。参见this blog post,MSDN和Living without D3DX