Программирование DirectX 12 - Рендеринг глубины в текстуру

directx 12 volume fog

Исходный код для Visual Studio 2019:

DirectX 12 Рендеринг глубины в текстуру - синхронизация CPU-GPU один CommandList
DirectX 12 Рендеринг глубины в текстуру - синхронизация CPU-GPU три CommandList
DirectX 12 Рендеринг глубины в буфер глубины - синхронизация CPU-GPU один CommandList
DirectX 12 Рендеринг глубины в буфер глубины - синхронизация CPU-GPU три CommandList

Что бы программировать DirectX12 вам необходимо минимум Windows 10.

В первом и третьем примере в приложении имеется один CmdList. Мы подаем порцию команд (кадр) от CPU на GPU и после подачи команд CPU ждет GPU когда GPU закончит работу (см.функцию Draw_MeshManager()). После этого CPU подает на GPU следующий кадр.

Второй и четверный пример - имеется три CmdList, и приложение постоянно подает кадры от CPU на GPU не дожидаясь окончания работы GPU (хотя есть синхронизация для каждого CmdList). Таким образом GPU постоянно загружено очередью кадров, кадры в GPU посылаются один за другим, не дожидаясь окончания работы GPU как в первом примере.

В первых двух примерах значения глубины записываются в обыкновенную текстуру которая установлена как render target.

Во вторых двух примерах значения глубины записываются в буфер глубины - это тоже обыкновенная текстура.

Во всех примерах на экране появляется объемный туман в виде куба. Есть два вида тумана- туман на всю сцену, и туман в каком то месте сцены т.е. туман заключен в объем. Для этого примера за объем для тумана взята модель куба. Всего приложение имеет три прохода шейдеров. В первом проходе в текстуру (буфер глубины) записываются значения глубины передних полигонов куба (глубина пикселей). Во втором прходе в другую текстуру записываются значения глубины пикселей задних полигонов куба. В третьем проходе мы устанавливаем в шейдер две предыдущие текстуры, в шейдере берем разницу между значениями глубины, и эта разница принимается за интенсивность тумана - пиксель с данной интенсивностью выводится на экран.