Internals of "StarCraft 2" game rendering engine. Part 2 (ru)
Продолжаем ковыряться в рендере старкрафта.
Рендер роликов концептуально очень похож на рендер игры, но есть и отличия. Как и в игровом рендере, если есть глобальные источники освещения, то создается шадоумапа от них. Затем идет отрисовка всех объектов в 4 рендер таргета формата argb16f:
- Основной буфер, куда ведется рендер цвета с освещением от глобальных источников. Альфа канал не используется.

- Нормали в пространстве камеры. В альфа канале глубина сцены.

- Диффузный цвет, который используется для некоторых пост процесс эффектов в дальнейшем. В альфа канал идет предрасчитанный статический (из текстур) АО фактор.

- Спекуляр фактор в RGB, альфа канал не используется.

После того как заполнили буфера нужными данными идет рендер локальных источников освещения. Алгоритм абсолютно аналогичен описанному в первой части. Помечаем область влияния источника с помощью стенсил буфера и геометрического футпринта, а затем рендерится опять этот же футпринт с шейдером освещения. Deferred shading в чистом виде. Для источников, которые должны отбрасывать тень сначала рендерится шадоумапа с его позиции (для спот и направленных источников; omnidirectional shadowmaps замечены небыли) затем рендерится деферред источник с этой картой тени. Пару примерчиков шадоумап:

Для примера, в этой сцене что на всех скриншотах, 24 deferred источника освещения, которые не отбрасывают тень, и еще 7, которые отбрасывают. Вот как получилось после применения источников освещения:

После идут все полупрозрачные объекты. Для крупных объектов прямо на месте применяется пост процесс эффект для искажения изображения находящегося за полупрозрачным объектом. Для этого используется текстура с диффузным цветом в рендер таргете 3. В рендере старкрафта 2 присутствуют также волуметрик эффекты, как то volumetric light и volumetric fog. Реализуется данный эффект в 5 проходов:
- Рендерим бэкфейсы объема очерчивающего границы влияния volumetric эффекта. Тест глубины включен. Записываем глубину в рендер таргет.

- Включаем альфаблендинг в режим сложения цветов (Blend source: D3DBLEND_ONE, Blend destination: D3DBLEND_ONE, Blend operation: D3DBLENDOP_ADD) и рисуем фронтфейсы объема, выводя отрицательную глубину пикселя. При блендинге пикселей происходит операция: глубина дальней стенки – глубина ближней стенки, что есть толщина объема в пространстве камеры.

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

- Так как на предыдущем шаге мы учитывали все объекты перед задней стенкой объема, даже те, что перед передней стенкой, мы должны исправить этот момент. Рисуем фронтфейсы с режимами как в шаге 3, только выводим минус глубину. Т.о. мы отнимаем глубину всех неверно учтенных пикселей, что находятся перед объемом volumetric эффекта.

- Используя текстуру глубины полученную на шагах 1-4, рисуем объем еще раз, но уже в главный рендер таргет цвета изменяя прозрачность в зависимости от глубин пикселей. Скриншот только эффекта:

Результат с остальной картинкой:

Далее идет Depth-of-Field. Эффект реализован достаточно интересно и в точности повторяет описание в презентации от разработчиков которую я упомянул в первой части. Я не буду повторяться тут, скажу лишь, что основная борьба велась за корректность отображения эффекта (правильность блендинга объектов перед, в и позади фокуса). После DoF идет Bloom. И на этом рендеринг заканчивается.
Отдельно хочется отметить 2 момента: Очень качественный рендеринг кожи человека, даже без применения хитрых техник, таких как texture space diffusion и subsurface scattering. Качественная настройка материалов и используемых текстур опять зарулило.
Отсутствие SSAO. Да-да. То о чем писали разработчики в своем докладе, почему-то не используется. Хотя шейдеры присутствуют. Я перепроверил настройки рендера когда обнаружил, что АО канал заполняется во время основного прохода рендера в 4 РТ. Видимо предрасчитанное АО устроило арт отдел. Вот красивая текстура лица Джима Рейнора с АО:

Вот собственно и все. Пишите комментарии, задавайте вопросы.
