2016-01-07 7 views
1

Я хотел бы реализовать выбор цвета в DirectX 12. Таким образом, в основном то, что я пытаюсь сделать, одновременно отображает два объекта рендеринга. Первая цель рендеринга должна содержать нормальный рендеринг, а второй должен содержать идентификатор объекта.C++, directx 12: Вопросы выбора цвета

Чтобы сделать два объекта рендеринга, я думаю, что все, что вам нужно сделать, это установить их с помощью OMSetRenderTargets.

Вопрос 1: Как указать, какой объект состояния шейдера или контура должен использоваться для конкретной цели рендеринга? Как, скажем, render_target_0 должен отображаться с помощью shader_0, render_target_1 должен отображаться с помощью shader_1?

Вопрос 2: Как вы читаете пиксель из буфера кадра после его визуализации? Похоже ли в DirectX 11 с помощью CopySubresourceRegion, затем Map? Вам нужно использовать кучу отзывов? Нужно ли использовать ресурсный барьер или забор или примитив некоторой синхронизации синхронизации, чтобы избежать одновременного использования центрального процессора и графического процессора?

Я пробовал искать ответы, но не очень далеко, потому что DirectX 12 довольно новый, и в DirectX 12 пока мало примеров, учебников или проектов с открытым исходным кодом.

Спасибо за вашу помощь заранее.

Дополнительные специальные бонусные баллы для примеров кода.

ответ

3

Поскольку я не получил никакого ответа на переполнение стека, я перекрестно отправленный на GameDev.net и получил хороший отклик там: http://www.gamedev.net/topic/674529-d3d12-color-picking-questions/

Для тех, находя это в будущем, я буду просто скопировать red75prime-х ответ от форума GameDev. Ответ

red75prime в:

Вопрос 1 не является специфичным для D3D12. Используйте один пиксельный шейдер с несколькими выходами. Rendering to multiple textures with one pass in directx 11

Вопросы 2. Да всем.

псевдокод:

ID3D12GraphicsCommandList *gl = ...; 
ID3D12CommandQueue *gqueue = ...; 
ID3D12Resource *render_target, *read_back_texture; 

... 
// Draw scene 
gl->DrawInstanced(...); 
// Make ready for copy 
gl->ResourceBarrier(render_target, RENDER_TARGET, COPY_SOURCE); 
//gl->ResourceBarrier(read_back_texture, GENERIC_READ, COPY_DEST); 
// Copy 
gl->CopyTextureRegion(...); 
// Make render_target ready for Present(), read_back_texture for Map() 
gl->ResourceBarrier(render_target, COPY_SOURCE, PRESENT); 
//gl->ResourceBarrier(read_back_texture, COPY_DEST, GENERIC_READ); 
gl->Close(); // It's easy to forget 

gqueue->ExecuteCommandLists(gl); 
// Instruct GPU to signal when command list is done. 
gqueue->Signal(fence, ...); 
// Wait until GPU completes drawing 
// It's inefficient. It doesn't allow GPU and CPU work in parallel. 
// It's here just to make example simple. 
wait_for_fence(fence, ...); 

// Also, you can map texture once and store pointer to mapped data. 
read_back_texture->Map(...); 
// Read texture data 
... 
read_back_texture->Unmap(); 

EDIT: Я добавил "GL-> Close()" к коду.

EDIT2: Переходы состояния для read_back_texture не нужны. Ресурсы в куче «назад» всегда должны иметь состояние COPY_DEST.