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

How to unbind a RenderTarget texture so it can be used as input to the next pass

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

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

简单但 "new to me" 的问题是,当我调用 PSSetShaderResources 并将纹理放入着色器的 texture/constant 缓冲区时,出现此错误:

"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);

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

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

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

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

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

但是,这确实有效:

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

更简单地说,当将资源设置回 null 时,您仍然必须告诉它您正在传递一个指针,尽管它是一个 null 指针。单独传递零计数的 null 似乎无济于事。