Skip to main content

Internals of "StarCraft 2" game rendering engine. Part 2 (ru)

· 4 min read

Продолжаем ковыряться в рендере старкрафта.

Рендер роликов концептуально очень похож на рендер игры, но есть и отличия. Как и в игровом рендере, если есть глобальные источники освещения, то создается шадоумапа от них. Затем идет отрисовка всех объектов в 4 рендер таргета формата argb16f:

  1. Основной буфер, куда ведется рендер цвета с освещением от глобальных источников. Альфа канал не используется.

RT1

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

RT2

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

RT3 RT3A

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

RT4

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

SM1 SM2 SM3

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

Scene and Lights

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

  1. Рендерим бэкфейсы объема очерчивающего границы влияния volumetric эффекта. Тест глубины включен. Записываем глубину в рендер таргет.

Volumetric Effect 1

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

Volumetric Effect 2

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

Volumetric Effect 3

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

Volumetric Effect 4

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

Volumetric Effect 5

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

Volumetric Effect 6

Далее идет Depth-of-Field. Эффект реализован достаточно интересно и в точности повторяет описание в презентации от разработчиков которую я упомянул в первой части. Я не буду повторяться тут, скажу лишь, что основная борьба велась за корректность отображения эффекта (правильность блендинга объектов перед, в и позади фокуса). После DoF идет Bloom. И на этом рендеринг заканчивается.

Отдельно хочется отметить 2 момента: Очень качественный рендеринг кожи человека, даже без применения хитрых техник, таких как texture space diffusion и subsurface scattering. Качественная настройка материалов и используемых текстур опять зарулило.

Отсутствие SSAO. Да-да. То о чем писали разработчики в своем докладе, почему-то не используется. Хотя шейдеры присутствуют. Я перепроверил настройки рендера когда обнаружил, что АО канал заполняется во время основного прохода рендера в 4 РТ. Видимо предрасчитанное АО устроило арт отдел. Вот красивая текстура лица Джима Рейнора с АО:

Raynor Face AO

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

Final