2015-03-04 2 views
0

Я пытаюсь сделать одновременно несколько ID3D11RenderTargetView. Но, похоже, что только первая цель визуализируется:OMSetRenderTargets отображает только первый предоставленный объект

ID3D11RenderTargetView* targets [ 2 ] = { _backbuffer 
              , _renderToTextureRTV 
              }; 

    _devcon->OMSetRenderTargets(2, targets, nullptr); 

В зависимости от параметра Уточняю первый в моей targets массиве, будет оказана. Другой целевой вид рендеринга не будет отображаться.

Я создаю свой IDXGISwapChain с флагом D3D11_CREATE_DEVICE_DEBUG и не вижу сообщений об ошибках, связанных с этой функцией.

Я могу воспроизвести ту же проблему, если я укажу nullptr как первый targets элемент. В этом случае второй элемент не будет отображаться. Но если я укажу nullptr как второй элемент, первый элемент будет отображаться правильно.

Почему OMSetRenderTargets только что оценил первый элемент targets?

Edit:

То, что я на самом деле пытается добиться того, чтобы оказать на BackBuffer и текстуры одновременно. Мне нужно отобразить текстуру, так как я хочу иметь доступ к значениям пикселей из CPU.

Я хочу визуализировать 16-разрядное изображение без знака, поэтому для текстуры я использую DXGI_FORMAT_R16G16B16A16_UNORM. Для бэкбуфера, мне нужно использовать другой формат, подходящий для отображения на экране, поэтому я использую DXGI_FORMAT_R16G16B16A16_FLOAT.

По соображениям производительности, я не хочу, чтобы между двумя этими элементами был преобразован элемент, и именно поэтому у меня есть две цели рендеринга.

+0

В вашем пиксельный шейдер, вы oututting ничего SV_Target1 (то есть вторая граница рендер-мишень). – Mrfence97

ответ

1

Является ли ваш пиксельный шейдер похожим на этот? Вам необходимо установить вручную, которые делают целевой пиксельного шейдера выходы:

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; 
}