如何取消绑定RenderTarget纹理,以便它可以用作下一遍的输入

时间:2015-07-16 22:51:49

标签: c++ direct3d hlsl

我有一个纹理,以及它的shaderresourceview,我通过将它用作RenderTarget来渲染场景的原始图像。

就像我之前的数百万人一样,然后我将它用作我下一个着色器的输入,这样我就可以模糊,做HDR,所有这一切。

简单但“对我来说新”的问题是,当我去调用PSSetShaderResources并将纹理放入着色器的纹理/常量缓冲区时,我得到了这个错误:

"Resource being set to PS shader resource slot 0 is still bound on output"

......这很有意义,因为它可能仍然存在。我的问题是如何解除纹理与初始传递的渲染目标的绑定?

我已经在做这个了,我认为它将它设置回DXUT在开始时使用的原始RenderTargetView,但它似乎没有释放纹理:

ID3D11RenderTargetView * renderTargetViewArrayTQ[1] = { DXUTGetD3D11RenderTargetView() };
pd3dImmediateContext->OMSetRenderTargets(1, renderTargetViewArray, nullptr);

2 个答案:

答案 0 :(得分:1)

假设您的渲染目标位于插槽0中:

ID3D11RenderTargetView * nullRTV = nullptr; d3dContext-> OMSetRenderTargets(1,& nullRTV,nullptr);

您需要传递长度为1的ID3D11RenderTargetView *数组,其中第一个数组需要为nullptr。

答案 1 :(得分:0)

从像素着色器取消绑定纹理时,这不起作用:

    ID3D11ShaderResourceView *const pSRV[1] = { NULL };
    pd3dImmediateContext->PSSetShaderResources(0, 0, pSRV);

然而,这可行:

    ID3D11ShaderResourceView *const pSRV[1] = { NULL };
    pd3dImmediateContext->PSSetShaderResources(0, 1, pSRV);

更简单地说,当将资源设置回null时,你仍然必须告诉它你传入一个指针,尽管是空指针。单独传递null而零计数似乎什么都不做。