Войти
Вячеслав ЕгоровСтатьи

Освещение в Valve’s Source Engine (перевод) (3 стр)

Автор:

4. Освещение моделей

  Для освещения персонажей и других динамических объектов, была создана система, которая объединяет параметры освещения, найденные просчётом Radiosity с локальными источниками света и картами окружения. На видеокартах с поддержкой пиксельных шейдеров 2.0 и ниже, рассчитывается диффузное освещение от двух источников света попиксельно или повершинно. На более новых видеокартах с более длинными пиксельными шейдерами, также добавляется расчет бликов с учётом коэффициентов Френеля, и некоторые другие эффекты.

4.1. Ambient Cube (Куб фонового освещения)

  Персонажи в игровом мире должны выглядеть натурально, вливаясь в окружение. Основная деталь освещения персонажей и объектов в Half-Life 2, это использование фонового значения света из объёма освещённости (Irradiance Volume), которое рассчитано по всему уровню.
  Большинство игр использует небольшое количество локальных источников света и одноканальную фоновую компоненту света, но в последнее время появляются примеры использования более сложных техник для расчета фонового освещения. К примеру, персонажи в играх с лайтмапами, как например Quake III, получают значение фонового света из карты освещения той поверхности, на которой находится игрок. Похожий на подход, используемый в движке Source, есть в игре Max Payne 2, которая хранит линейные 4-ёх компонентные коэффициенты сферических гармоник (которые действуют как пара направленных источников света) в Irradiance Volume, для дальнейшего расчета освещения.

Изображение

Изображение 4. Куб фонового освещения.

  Из-за особого представления семплов окружающего освещения (в особенности, кубические карты окружающей освещённости низкого разрешения), которые сохраняют только непрямой или отраженный свет, в движке Source они называются Ambient Cubes – куб фонового освещения. Нахождение значения фонового освещения может быть произведено как попиксельно, так и повершинно. Расчёт заключается в простом взвешивании шести цветов, где веса зависят от нормали в мировом пространстве. Следующий HLSL код показывает функцию для получения освещённости по нормали:

float3 AmbientLight( const float3 worldNormal )
{
  float3 nSquared = worldNormal * worldNormal;
  int3 isNegative = ( worldNormal < 0.0 );
  float3 linearColor;
  linearColor = nSquared.x * cAmbientCube[isNegative.x]   +
                       nSquared.y * cAmbientCube[isNegative.y+2] +
                       nSquared.z * cAmbientCube[isNegative.z+4];
  return linearColor;
}

Листинг 1. Функция расчёта фонового значения света (6 инструкций вертексного шейдера, или 11 инструкций пиксельного)

  Расчёт по кубу фонового освещения очень прост и шесть требуемых цветов могут быть загружены в константы шейдера. Как было отмечено выше, на целевом оборудовании с SM2.0 можно рассчитать диффузный свет лишь от двух локальных источников света. Поэтому, любые значительные источники света кроме главных двух считаются не локальными и совмещаются с цветами куба фонового света в реальном времени при отрисовке каждого объекта. Эти шесть RGB цветов являются более лаконичным выбором, чем первые два порядка сферических гармоник (девять RGB цветов). Как показано в таблице 5 ниже, можно улучшить точность расчёта непрямого освещения, заменив шесть цветов на сферические гармоники. С увеличенным количеством константных регистров в ps_3_0 (до 224 против 32 на ps_2_x картах), может появиться хорошая возможность для дальнейшего улучшения технологии.

Изображение

Изображение 5. Сравнение сферических гармоник с кубом фонового света  Valve

4.2 Объём освещенности (IrradianceVolume)

  Значения направленной освещённости, или значения куба фонового света хранятся в 3Д структуре, которая отображается на весь игровой мир. Эта структура не иерархическая, а регулярная, с довольно большим шагом (1.2м х 1.2м х 2.4м) так как фоновое освещение медленно изменяется от точки к точке, и большее значение имеет скорость выборки из структуры, а не точность получаемых данных. При отрисовке любого динамичного объекта или персонажа, как например Алекс на изображениях ниже, из структуры берется ближайшее значение для центра объекта, без какой либо интерполяции. Конечно, это может привести к резким изменениям значения фонового освещения, когда объект или персонаж перемещается по миру, поэтому было решено изменять фоновые и локальные значения освещения плавно, с течением времени, для того чтобы уменьшить вероятность резкого изменения освещения и избавится от прочих визуальных артефактов.
  На важных персонажах, таких как Алекс, эвристически увеличивается влияние фонового освещения, чтобы не было видно, как направленное освещение портит вид фонового, делая его невыразительным и грубым.

Изображение

Изображение 6. Алекс, освещённая двумя отдалёнными источниками света, и значение фонового освещения. (Слева - без увеличения. Справа - с увеличением)

4.3 Локальное освещение

  Как уже было отмечено, предрассчитанные данные из Irradiance Volume включают в себя только фоновое освещение. Для освещения от локальных источников света, к сумме добавляются величины, рассчитанные по модифицированным формулам Ламбертиана и Фонга. На видеокартах уровня SM2.0  (10% пользователей) рассчитывается диффузное освещение, не более чем от двух локальных источников света. Прочие источники, кроме двух самых важных, запекаются в куб фонового освещения на лету. Начиная с Half-Life 2: Episode 1, на видеокартах с поддержкой ps_2_b или ps_3_0 (74% пользователей), движок Source также рассчитывает рефлексы по Фонгу для двух самых важных источников света.

4.4 Half Lambert Diffuse

  Для того чтобы смягчить влияние диффузного освещения от локальных источников света, скалярное произведение из модели Ламбертиана умножается на 0.5, затем к нему прибавляется 0.5 и после этого результат возводится в квадрат. Скалярное произведение (красная кривая на изображении 7), которое даёт значения в диапазоне [-1; 1], переходит в диапазон [0; 1] и имеет приятный мягкий спад (синяя кривая на изображении 7).
Изображение
Изображение 7. Начальная функция (красная) Half Lambert Diffuse (синяя)

  Эта техника, которую в Valve называют диффузным освещением Полу-Ламберта, предохраняет задние грани объекта (относительно источника света) от потери формы и плоского вида. Это не физически корректная техника, но улучшение внешнего вида просто огромно за такую тривиальную цену имплементации. В оригинальной игре Half-Life, где диффузная компонента Полу-Ламберта была единственной компонентой освещения большинства моделей, она по-особенному освещала их задние грани (относительно источника света).

Изображение

Таблица 8. Сравнение результата традиционной формулы Ламберта и фонового света с формулой Полу-Ламберта и кубом фонового света для диффузного освещения.

Изображение

Таблица 9. Диффузное освещение Алекс по формулам Полу-Ламберта и кубом фонового света.

4.5 Локальные блики

  На пиксельных шейдерах модели ps_2_b и ps_3_0, алгоритмы освещения больше не ограничены длинной шейдера, поэтому для дальнейшего увеличения визуального качества заключается в добавлении бликов, где это уместно. Начиная с Half-Life 2: Episode 1, художникам была дана возможность включить освещение по Фонгу, которое может использовать спекулярные карты (specular map) и экспоненциальные карты (gloss map). Как можно увидеть на изображениях в таблице 10, блики хорошо вписываются в уже существующую систему освещения и предоставляют повышенную выразительность. Для того чтобы рефлексы не сделали объекты пластиковыми на вид, карта бликов довольно тусклая и экспонента не очень большая, что даёт широкие блики. В расчётах локальных бликов также используются значения Френеля (Таблица 10б), рассчитанных относительно направлению взгляда. Под очень яркими лампами, рефлексы часто получаются довольно яркими и высвечиваются очень выразительно после применения ХДР пост-процессинг приёмов, о которых говорится на следующей странице.

Изображение

Таблица 10. Бликовое освещение в Half-Life 2: Episode 1.
Изображение
Таблица 11. Бликовое освещение, добавленное в финальную формулу.
В Half-Life 2: Episode 1, 26% наших пользователей увидят картинку (a) в то время как 74% с железом, поддерживающим ps_2_b+ увидят дополнительные блики, как на картинке (c).

Страницы: 1 2 3 4 5 Следующая »

#HDR, #shading, #tone mapping, #Valve

2 декабря 2008 (Обновление: 20 дек 2008)

Комментарии [3]