Ru/Source 2/Docs/Level Design/Lighting

При рендеринге объектов в 3D движок Half-Life: Alyx использует симуляцию того как свет появляется в реальной жизни, позволяя поверхностям реалистично отражать падающий от источников свет, общее освещение и тому подобное, при этом и статические и динамические объекты отбрасывают тени от источников света. Для обеспечения визуальной точности и высокой производительности инструментам мастерской требуется предварительно рассчитать большой объем информации - хранение данных освещения в разных формах, таких как текстуры Lightmap, light probe volumes и cubemaps.
Но, в любом случае, чем являются все эти вещи?
Входы в сстему освещения подразделяются на следующие:
* Текстура Lightmap Player Space на статичной геометрии
* Light Probe Volume и Кубические карты (Окружающее освещение [англ. Ambient lighting] на динамических объектах, отражения)
* Источники света [пример: light_environment, light_omni, light_spot и light_ortho]
* Объемный туман [англ. Volumetric fog]
Для предварительного просмотра того, как все будет выглядеть в Hammer, можно использовать настройку из верхнего меню 'Preview Baked Lighting'. Это позволит сделать низкокачественный предпросмотр того, как будет выглядеть окончательное освещение в VR, что очень поможет с художественным направлением, дизайном геймплея и тому подобное. Настройка использует вертексное освещение и много по-пиксельных динамических источников света вместо карт освещения, поэтому требует меньше предварительных расчетов, но приводит к снижению качества и более дорогостоящему рендерингу во время выполнения.
Понадобится создать карты освещения [англ. lightmaps] для качественного и оптимизированного освещения, но для тестирования в низком качестве VR достаточно и освещения предпросмотра. Для всех остальных случаев, кроме простейшей тестовой карты, частота кадров будет ужасно низкой, поэтому не используйте такой свет в релизе вашего дополнения!
== Типы источников света ==
Источники света бывают разных типов в зависимости от того, как рассеивается свет, исходящий от них. Разместить источники света на карте можно с помощью Entity Tool в Hammer, расположенного в левой панели инструментов. Его легко можно найти по значку - стилизованной лампочке.
После размещения источника света на карте, можно выбрать его в 3D-виде и установить его цвет, яркость, максимальную дистанцию и т.д. В правом нижнем углу в "Свойствах Объекта":
* Свет окружающей среды - light_environment
** Виртуальный солнечный свет с неба - источник света находится бесконечно далеко
** Нет затухания с расстоянием
** Обычно только один на карте
** Очень полезные пресеты находятся в префабах in workshop_examples/prefabs/environment_settings
* Точечный свет - light_omni
** Один всенаправленный источник света
** Немного похож на обычную лампочку.
* Прожектор - light_spot
** Направленный из определенной точки источник света
** Он как настоящий прожектор и это удивительно!
* Орто свет - light_ortho
** Чтобы его разместить, необходимо выбрать 'light_ortho' в выпадающем меню класса энтити
** Нечто среднее между светом окружающей среды и прожектором
** Световые лучи от этого источника параллельны, но существуют только внутри конкретного кубоида
** Как и свет окружающей среды, не затухает с расстоянием
** Прекрасно подходит для ограниченных световых люков (просветов) и для прочих специальных целей.
== Прямое и рассеянное освещение ==
Источники света состоят из двух компонентов:
* Направленный свет [англ. Direct lighting] - основной компонент на основе прямой видимости до источника света
* Рассеянный свет [англ. Indirect lighting] - Дополнительный компонент, состоящий из света, отражающегося от одной поверхности к другой, может быть почти незаметным, но заметно улучшает виртуальный реализм.
 - primary component based on line of sight to light source
То, каким образом будет рендериться прямое освещение, является основным выбором при разработке карты
=== По умолчанию используется Индекс запеченного света (англ. Baked Light Indexing) ===
* Выбран с 'Direct Lighting' (прямым освещением) установленным в 'Baked' (запеченный) со включенной опцией 'Baked Light Indexing' (Индекс запеченного света) (по умолчанию)
* По умолчанию, рассеянный свет запекается в карты освещения (lightmaps) (для статичных поверхностей) и light probe volumes (для динамических объектов)
Преимущества: 
* Прямое освещение имеет зеркальный (блестящий) компонент
* Может отбрасывать тени от динамических объектов (персонажей, физических пропов и т.д.)
* Реалистичное накладывание теней от статической геометрии (с использованием радиуса источника света / SunSpreadAngle)
* Прямое освещение может мерцать, стробировать, включаться и выключаться (управление происходит через имя светового энтити и через его I/O 
* Относительно дешевый рендеринг!
Недостатки:
* Может быть только четыре индексированных источника света, сияющих на одной поверхности в определенное время, иначе будут происходить странные вещи (лучше всего оставить один или два таких источника света, чтобы облегчить рендеринг)
** Предварительный просмотр возможен через меню в верхнем правом углу 3D вида в Hammer, установите 'Tools Visualization Mode' в 'Baked Lighting Complexity'
** Черный — это цвет с нулевым индексом на этой поверхности, Красный - с индексом 1, Оранжевый - 2, Желтый - 3, Белый - 4, а Сине-зелёный.. НЕ ДЕЛАЙТЕ ЭТОГО!
* Источник света не может двигаться
* Только один индексированный источник света может отбрасывать тени от динамических объектов в единицу времени
* Рассеянный компонент не может быть включен ил выключен - установите его в 'None', если хотите полностью управлять своим светом
* Есть ограничение по количеству проиндексированных источников света на карте, хотя вы вряд ли его достигните при обычном использовании такого света
=== Полностью запеченное прямое освещение ===
* Выбирается с помощью 'Direct Lighting', установленного в 'Baked' и отключенной опцией 'Baked Light Indexing'
Преимущества:
* Рендер почти ничего не стоит!
** Прямой компонент освещения хранится в картах освещения и light probe volumes, так же, как и рассеянный компонент
* Realistic contact hardening on shadows from static geometry (using Light Source Radius / SunSpreadAngle)
Недостатки:
* Прямое освещение не имеет зеркальной составляющей
** Освещенные поверхности могут выглядеть сухими и покрытыми коркой
** Получают направленность от направленности карт освещения
* Не могут отбрасывать тени от динамических объектов
* Источники света не могут двигаться
* Нельзя выключить или включить свет, свет не может мерцать или вспыхивать
=== Попиксельное прямое освещение ===
Выбирается с помощью 'Direct Light', установленным в 'Per Pixel'
Может быть очень дорогим; обычно используется в особых случаях (например фонарик игрока или для очень маленьких источников света (светящиеся метки на боеприпасах, смоле и т.д.)
Используйте только если вы абсолютно уверены, что это вам необходимо и это как раз тот случай
* Ищите примеры в поставляемых картах для получения дополнительной информации
Преимущества:
* Может иметь высококачественный зеркальный компонент (хотя отраженный свет будет выключен для маленьких источников света, как упомянуто выше)
* Может иметь полностью динамические тени (опять же, они выключены для все тех же небольших источников света)
* Можно двигать источником света как фонариком игрока!
* Прямое освещение может мерцать, вспыхивать, включаться и выключаться
Недостатки:
* Может быть дорогим!
* No contact hardening (Light Source Radius / SunSpreadAngle do nothing)
* Рассеянный компонент все еще запекается в картах освещения и т.д., если такое включено (переключите на 'None' в большинстве случаев)
* Вне освещения в предпросмотре мы поддерживаем только: 
** Один light_spot или light_ortho с тенями, включенными в "просмотре"
** До 8 light_omni с отключенными тенями и зеркальностью и полностью линейное затухание
=== Рассеянный свет ===
For proper indirect lighting on dynamic objects, you want to place Light Probe Volume and Cubemap entities - env_combined_light_probe_volume
* You want the center of each to be a typical, average view in that particular volume, be it a room, corridor, outdoors scene etc.
** For a simple cuboid room, you'd place it right at the centre, about eye height
* Extend the volume bounds (red, green and blue 3D arrows) to fully enclose that volume
** Reflections are done with box-projected cubemaps - imagine a box with a texture on each face
** In that simple cuboid room, you'd want the volume bounds to meet the walls, floor and ceiling
** Reflections would thus be of a simplified version of that very room, with correct apparent depth and everything
* Volumes can be rotated and can overlap - can set the priority to make one override another (e.g. a dark player-accessible box surrounded by sunlit outdoors)
* Hammer geometry should be broken into separate meshes as necessary
** Each mesh can only receive reflections from one cubemap
** Don't worry about effectively adding extra geometry, vertices etc. in the process - all kinds of fancy mesh dissection stuff goes on behind the scenes with and similar anyway.
* All accessible areas should be enclosed by light probe volumes - if you have dynamic objects suddenly flashing really bright or whatever, you may have missed a bit
== Lightmap player spaces ==
Lightmaps are textures containing precalculated lighting information for static surfaces. You want these to be as high resolution as possible for the best visual fidelity. You can ensure the compilation process automatically prioritizes player-accessible stuff by placing lightmap player space volumes - quite simply, these are Hammer meshes with materials/tools/toolslightmapres.vmat on them. The closer a surface is to one of these meshes, the more lightmap texels are assigned to it.
The general gist of it is - place these lightmap player space volumes within areas the player can get to. Inaccessible areas - things behind fences, high up on walls, distant buildings - will thus be assigned fewer and fewer lightmap texels depending on how far away they are.
The net result is apparently seamless lightmap detail!
== Basic summary of lighting: ==
* Use indexed lights for the key lights in your scene - sunlight, major light sources etc. that you want specular from, switchable / flickering lights etc.
** The 'Baked Lighting Complexity' visualization mode will show you how things are looking in terms of rendering cost
** Ideally, you want things black, red and a bit of orange and yellow
* Use fully baked lights for visually less important things - fill lights, things in background, dimmer light sources
* Use per-pixel lights only for very particular reasons - if in doubt, don't.
== Объёмный туман==
В Half-Life: Alyx используются система вокселей для взаимодействия с освещением. Туман, блики света, лучи солнца проходящие сквозь стекло. Всё это возможно при использовании системы объёмного тумана. 
Чтобы включить его на карте, поместите объект env_volumetric_fog_controller. Настройки по умолчанию, как правило хватит.
You can set volume-specific fog with env_volumetric_fog_volume entities - drag out the volume bounds in a similar way to light probe volumes. For harder edges to a fog volume, select the fog volume entity and set 'Falloff Exponent' to a low value such as zero.
Вы можете установить специфический туман используя env_volumetric_fog_volume 
Next, you need to set light sources to contribute to volumetric fog. Select a light entity, then set 'Volumetric Fogging' to 'Baked'. You can tweak the fog intensity with 'Fog contribution strength'
One drawback is that for outdoors areas, sunlit things will suddenly look darker. By default, atmosphere will absorb light. Normally we'd fix this by enabling volumetric fogging on the sunlight, but unfortunately environment lights (such as that sunlight) can't contribute to volumetric fog, for various technical reasons.
It's possible to locally fake stuff with a fog volume set to a low fog strength (to minimize atmospheric darkening), then a light_ortho with volumetric fog enabled, a low brightness, high fog contribution strength, and angles and color set to the same as the sunlight light_environment.
You can have many light sources with volumetric fogging enabled - additional rendering cost per light source is relatively minor. For light_omnis, set as many as you can to 'Baked: No shadows' or graphics programmers will be sad.
Look at shipping maps for more examples!
== Генерация освещения (компиляция) ==
=== Предосмотр запекаемого освещения ===
Для предварительного просмотра в Hammer того,как ваша карта будет выглядеть при полной компиляции, используйте в верхней части редактора вкладку Preview Baked Lighting : Bake All Lighting
Это позволит Вам увидеть общую картину освещения, естественно более низкого качества, нежели если бы компилировали карту. Не забывайте постоянно обновлять освещение, после внесения изменений в проект вашей
карты. 
=== Построение карты освещения ===
Когда Вы посчитаете, что ваша карта готова для теста, то нажмите F9 чтобы вызвать окошко настройки компиляции. Стандартный шаблон Full Compile будет генерировать 1к лайтмапы - это не должно затягивать процесс компиляции на простых картах. Чтобы сбилдить кубмапы для отражений на воде и металлических поверхностях, не забудьте поставить галочку на Buildcubemaps on load
Чтобы провести финальную компиляцию уже готовой карты, выберете Final Compile. Таким образом Вы получите более качественные лайтмапы 2к разрешения. Разумеется, что финальная компиляция потребует гораздо больше времени на сложных картах.
= См. Также =