Лекция
В современных 3D-движках (Unity, Unreal Engine и др.) освещение — один из самых ресурсоемких процессов.
Чтобы добиться высокого FPS и качественной картинки, нужно грамотно оптимизировать освещение.
Использование запеченного (baked) освещения:
Подходит для статических объектов и сцен.
Вычисляется заранее, что сильно снижает нагрузку на GPU.
Unity: Lighting → Lightmapping.
Light Probes и Reflection Probes:
Light Probes интерполируют освещение для динамических объектов на основе окружающего baked-освещения.
Reflection Probes создают реалистичные отражения без дорогостоящих real-time отражений.
LOD и затенение (shadow) оптимизация:
Отключение или замена теней на более дешевые (например, blob shadows).
Использование Cascaded Shadow Maps только вблизи камеры.
Использование освещения с низкой частотой обновления (Mixed или Realtime + Distance-based updates).
Ограничение количества источников света:
Реалтайм-источники должны быть по возможности Directional или Spot.
Избегайте множества Point Light-ов с real-time тенями.

PBR — это подход к визуализации, при котором материалы и освещение моделируются на основе физических свойств реального мира.
Энергосохранение: Свет не может отражаться сильнее, чем падает.
Микрофацетная модель: Поверхность состоит из микроскопических фасеток, отражающих свет по-разному.
BRDF (Bidirectional Reflectance Distribution Function): Описывает, как свет отражается от поверхности.
Albedo (Base Color): Цвет материала без освещения.
Metallic: Значение от 0 (диэлектрик) до 1 (металл).
Roughness (или Smoothness): Гладкость поверхности. Чем выше roughness, тем более рассеянное отражение.
Normal Map: Детализация поверхности без увеличения полигонажа.
AO (Ambient Occlusion): Самозатенение в углах и выемках.
Используется Standard Shader, который полностью поддерживает PBR.
Можно работать с HDRP (High Definition Render Pipeline) для более реалистичного освещения.
Материалы в игровых движках — это комбинации текстур и параметров, определяющих, как объект взаимодействует со светом.
Используйте tileable (бесшовные) текстуры.
Следите за разрешением: 2K и 4K текстуры — только для ключевых объектов.
Комбинируйте текстуры в один Texture Atlas для оптимизации.
Шейдер — это программа, выполняющаяся на GPU и управляющая визуализацией пикселей и вершин.
Типы шейдеров:
Vertex Shader — обрабатывает вершины.
Fragment (Pixel) Shader — обрабатывает пиксели.
Surface Shader (Unity) — абстракция над низкоуровневыми шейдерами, упрощающая работу.
Избегайте сложных математических операций в фрагментных шейдерах.
Профилируйте производительность (Unity Profiler, Frame Debugger).
Используйте шейдерные уровни детализации (Shader LOD).
Принцип написания простого пост-обработочного шейдера (image effect shader) в Unity, который изменяет яркость, контраст и насыщенность, основан на манипуляции финального изображения на экране.
Вот пример такого простого шейдера + C#-скрипта, который можно использовать как эффект камеры:
| Этап | Назначение |
|---|---|
| Properties | Параметры, видимые в инспекторе |
| SubShader / Pass | Как рендерить объект (один или несколько проходов) |
| Vertex Shader | Определяет, где находятся вершины на экране |
| Fragment Shader | Определяет цвет каждого пикселя |
| Sampler2D / Textures | Получение цвета из текстуры |
| Math / Lighting | Расчеты освещения, цвета, эффектов и т.д. |
| Тип | Пример | Назначение |
|---|---|---|
| Surface Shader | #pragma surface surf Lambert | Упрощенное описание материалов с освещением |
| Vertex/Fragment Shader | #pragma vertex vert | Полный контроль над рендером |
| Post-processing Shader | OnRenderImage() | Эффекты на изображение камеры |
| Shader Graph (URP/HDRP) | Визуально | Визуальное создание без кода |
Определи задачу — что шейдер должен делать? (изменять цвет, добавлять свечения, искажения, эффект воды и т.д.)
Выбери тип шейдера — Surface, Fragment/Vertex, Shader Graph или Post-Effect.
Описывай свойства — для взаимодействия с инспектором или скриптами.
Напиши логику — вершины (vert) и пиксели (frag), работа с текстурами, цветами, освещением.
Компилируй и тестируй — в редакторе или Play Mode.
Оптимизируй — по возможности упрощай расчеты, особенно для мобильных.
Создай новый файл SaturationContrastBrightness.shader:
Shader "Custom/SaturationContrastBrightness"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Brightness ("Brightness", Range(-1, 1)) = 0
_Contrast ("Contrast", Range(0, 2)) = 1
_Saturation ("Saturation", Range(0, 2)) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
ZTest Always Cull Off ZWrite Off
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _Brightness;
float _Contrast;
float _Saturation;
fixed4 frag(v2f_img i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// Яркость
col.rgb += _Brightness;
// Контраст (относительно 0.5)
col.rgb = ((col.rgb - 0.5) * _Contrast) + 0.5;
// Насыщенность
float gray = dot(col.rgb, float3(0.299, 0.587, 0.114)); // Перевод в оттенки серого
col.rgb = lerp(gray.xxx, col.rgb, _Saturation);
return col;
}
ENDCG
}
}
}
2. Скрипт C# для камеры
using UnityEngine;
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class SCBEffect : MonoBehaviour
{
public Shader shader;
private Material _material;
[Range(-1, 1)] public float brightness = 0;
[Range(0, 2)] public float contrast = 1;
[Range(0, 2)] public float saturation = 1;
void Start()
{
if (shader == null)
shader = Shader.Find("Custom/SaturationContrastBrightness");
if (shader != null)
_material = new Material(shader);
}
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (_material != null)
{
_material.SetFloat("_Brightness", brightness);
_material.SetFloat("_Contrast", contrast);
_material.SetFloat("_Saturation", saturation);
Graphics.Blit(source, destination, _material);
}
else
{
Graphics.Blit(source, destination);
}
}
}
Создай C#-скрипт SCBEffect.cs и прикрепи его к камере:
Прикрепи SCBEffect.cs к камере.
Укажи или назначь в инспекторе созданный шейдер Custom/SaturationContrastBrightness.
Регулируй параметры brightness, contrast, saturation.
Один Directional Light для солнца.
Используйте Skybox с изображением дневного неба.
Тени — мягкие, направленные.
Высокое значение Ambient Light (Environment Lighting → Source: Skybox).
Добавьте Bloom и SSAO для объема.
Directional Light уменьшенной интенсивности (или вообще отключен).
Используйте точечные источники света (Point/Spot) для фонарей, окон, костров.
Skybox — звездное или облачное ночное небо.
Ambient Light → Color или Gradient, с холодным оттенком.
Эффекты: Fog, Lens Flares, Glow, Volumetric Light.
Реализуется через скрипт, плавно изменяющий параметры освещения, тумана, skybox.
Можно использовать анимации или Shader Graph для динамики.
Техническая грамотность в освещении — основа визуальной достоверности и высокой производительности. Использование PBR, правильное управление шейдерами и понимание сценических условий позволяет создавать сцены, которые не только выглядят реалистично, но и работают быстро даже на слабом железе.
Комментарии
Оставить комментарий
Освещение локаций в играх и кинематографе
Термины: Освещение локаций в играх и кинематографе