如何取消绑定 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 似乎无济于事。
我有一个纹理及其 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 似乎无济于事。