Исходный код для Visual Studio 2019:
DirectX 12 Освещение по Фонгу ADS - синхронизация CPU-GPU один CommandListЧто бы программировать DirectX12 вам необходимо минимум Windows 10.
В первом примере в приложении имеется один CmdList. Мы подаем порцию команд (кадр) от CPU на GPU и после подачи команд CPU ждет GPU когда GPU закончит работу (см.функцию Draw_MeshManager()). После этого CPU подает на GPU следующий кадр.
Второй пример - имеется три CmdList, и приложение постоянно подает кадры от CPU на GPU не дожидаясь окончания работы (хотя есть синхронизация для каждого CmdList). Таким образом GPU постоянно загружено очередью кадров, кадры в GPU посылаются один за другим, не дожидаясь окончания работы GPU как в первом примере.
В обеих примерах производится расчет освещения по Фонгу - т.е. производится интерполяция нормалей, для каждого пикселя расчитывается освещение. Например при расчете освещения по Гуро методу, для каждой вершины треугольника рассчитывается освещение в зависимости от нормали. Потом цвета (освещенность) каждой вершины в треугольнике интерполируются во время растеризации. А в затенении по Фонгу - интерполируются нормали к каждой вершине, таким образом каждый пиксель при растеризации получает свою нормаль.
Причем различают затенение по Фонгу - это интерполяция нормалей. И есть освещение по Фонгу - это расчет Ambient, Diffuse, Specular цветов - и в итоге сложение этих цветов в одну компоненту. Это так называемое освещение ADS по Фонгу. По модели Гуро просто рассчитывается диффузная освещенность в зависимости от нормали (по закону Ламберта).
Point Light можно представить в виде свечки или лампочки - свет распространяется в виде сферы в разные стороны и затухает на определенной дистанции от источника света.
Spot Light можно представить в виде фонарика - куда смотрит камера, в том направлении и происходит освещение в виде пятна света (окружность, овал при наклонах поверхности) - как обычный фонарик.