OMSetRenderTargets 只呈现第一个提供的目标
OMSetRenderTargets renders only first provided target
我正在尝试同时渲染多个 ID3D11RenderTargetView
。
但是好像只渲染了第一个目标:
ID3D11RenderTargetView* targets [ 2 ] = { _backbuffer
, _renderToTextureRTV
};
_devcon->OMSetRenderTargets( 2, targets, nullptr );
根据我在 targets
数组中首先指定的参数,将被渲染。另一个渲染目标视图将不会被渲染。
我用 D3D11_CREATE_DEVICE_DEBUG
标志创建了我的 IDXGISwapChain
,但看不到与此函数相关的任何错误消息。
如果我将 nullptr
指定为第一个 targets
元素,我可以重现同样的问题。在这种情况下,第二个元素将不会被渲染。
但是如果我指定 nullptr
作为第二个元素,第一个元素将被正确渲染。
为什么 OMSetRenderTargets
似乎只评估第一个 targets
元素?
编辑:
我实际上想要实现的是同时渲染到后台缓冲区和纹理。我需要渲染到纹理,因为我希望能够从 CPU.
访问像素值
我想渲染成 16 位无符号图像,所以我使用 DXGI_FORMAT_R16G16B16A16_UNORM
作为纹理。
对于后台缓冲区,我需要使用适合屏幕显示的不同格式,所以我使用 DXGI_FORMAT_R16G16B16A16_FLOAT
.
出于性能原因,我不想在两者之间进行逐元素转换,这就是我有两个渲染目标的原因。
你的像素着色器和这个相似吗?您需要手动设置像素着色器输出到哪个渲染目标:
struct Output
{
float4 target0 : SV_Target0;
float4 target1 : SV_Target1;
};
Output PixelShader(float4 pos : SV_Position)
{
Output output;
output.target0 = float4(1.0, 0, 0, 0); //Output to the first rendertarget
output.target1 = float4(0, 1.0, 0, 0); //Output to the second rendertarget
return output;
}
我正在尝试同时渲染多个 ID3D11RenderTargetView
。
但是好像只渲染了第一个目标:
ID3D11RenderTargetView* targets [ 2 ] = { _backbuffer
, _renderToTextureRTV
};
_devcon->OMSetRenderTargets( 2, targets, nullptr );
根据我在 targets
数组中首先指定的参数,将被渲染。另一个渲染目标视图将不会被渲染。
我用 D3D11_CREATE_DEVICE_DEBUG
标志创建了我的 IDXGISwapChain
,但看不到与此函数相关的任何错误消息。
如果我将 nullptr
指定为第一个 targets
元素,我可以重现同样的问题。在这种情况下,第二个元素将不会被渲染。
但是如果我指定 nullptr
作为第二个元素,第一个元素将被正确渲染。
为什么 OMSetRenderTargets
似乎只评估第一个 targets
元素?
编辑:
我实际上想要实现的是同时渲染到后台缓冲区和纹理。我需要渲染到纹理,因为我希望能够从 CPU.
访问像素值我想渲染成 16 位无符号图像,所以我使用 DXGI_FORMAT_R16G16B16A16_UNORM
作为纹理。
对于后台缓冲区,我需要使用适合屏幕显示的不同格式,所以我使用 DXGI_FORMAT_R16G16B16A16_FLOAT
.
出于性能原因,我不想在两者之间进行逐元素转换,这就是我有两个渲染目标的原因。
你的像素着色器和这个相似吗?您需要手动设置像素着色器输出到哪个渲染目标:
struct Output
{
float4 target0 : SV_Target0;
float4 target1 : SV_Target1;
};
Output PixelShader(float4 pos : SV_Position)
{
Output output;
output.target0 = float4(1.0, 0, 0, 0); //Output to the first rendertarget
output.target1 = float4(0, 1.0, 0, 0); //Output to the second rendertarget
return output;
}