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

时间:2018-10-24 10:06:11

标签: directx directx-11

当我尝试使用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);

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

有人可以告诉我代码有什么问题或确认此问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

请确保使用GitHubNuGet上托管的最新版的Effect 11。弗兰克的书随附的副本很旧。有关差异的一些说明,请参见wiki和项目自述文件。

  

请注意,尽管该书仍然非常有用且相关,但大量使用了旧版DirectX SDK中的支持库。您可以并且应该避免将旧版DirectX SDK用于Direct3D 11或更高版本。参见this blog postMSDNLiving without D3DX