Модуль 4: Технические аспекты Оптимизация освещения для производительности Физически корректное освещение (PBR) Работа с материалами и шейдерами кратко

Лекция



Тема 1: Оптимизация освещения для производительности

В современных 3D-движках (Unity, Unreal Engine и др.) освещение — один из самых ресурсоемких процессов.

Чтобы добиться высокого FPS и качественной картинки, нужно грамотно оптимизировать освещение.

Основные техники оптимизации:

  1. Использование запеченного (baked) освещения:

    • Подходит для статических объектов и сцен.

    • Вычисляется заранее, что сильно снижает нагрузку на GPU.

    • Unity: Lighting → Lightmapping.

  2. Light Probes и Reflection Probes:

    • Light Probes интерполируют освещение для динамических объектов на основе окружающего baked-освещения.

    • Reflection Probes создают реалистичные отражения без дорогостоящих real-time отражений.

  3. LOD и затенение (shadow) оптимизация:

    • Отключение или замена теней на более дешевые (например, blob shadows).

    • Использование Cascaded Shadow Maps только вблизи камеры.

  4. Использование освещения с низкой частотой обновления (Mixed или Realtime + Distance-based updates).

  5. Ограничение количества источников света:

    • Реалтайм-источники должны быть по возможности Directional или Spot.

    • Избегайте множества Point Light-ов с real-time тенями.

Модуль 4: Технические аспекты Оптимизация освещения для производительности  Физически корректное освещение (PBR)  Работа с материалами и шейдерами

Тема 2: физически корректное освещение (PBR — Physically Based Rendering)

PBR — это подход к визуализации, при котором материалы и освещение моделируются на основе физических свойств реального мира.

Основы PBR:

  • Энергосохранение: Свет не может отражаться сильнее, чем падает.

  • Микрофацетная модель: Поверхность состоит из микроскопических фасеток, отражающих свет по-разному.

  • BRDF (Bidirectional Reflectance Distribution Function): Описывает, как свет отражается от поверхности.

Основные свойства PBR-материалов:

  1. Albedo (Base Color): Цвет материала без освещения.

  2. Metallic: Значение от 0 (диэлектрик) до 1 (металл).

  3. Roughness (или Smoothness): Гладкость поверхности. Чем выше roughness, тем более рассеянное отражение.

  4. Normal Map: Детализация поверхности без увеличения полигонажа.

  5. AO (Ambient Occlusion): Самозатенение в углах и выемках.

В Unity:

  • Используется Standard Shader, который полностью поддерживает PBR.

  • Можно работать с HDRP (High Definition Render Pipeline) для более реалистичного освещения.

Тема 3: Работа с материалами и шейдер ами

Материалы:

Материалы в игровых движках — это комбинации текстур и параметров, определяющих, как объект взаимодействует со светом.

  • Используйте 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 Расчеты освещения, цвета, эффектов и т.д.

Типы шейдеров в Unity

Тип Пример Назначение
Surface Shader #pragma surface surf Lambert Упрощенное описание материалов с освещением
Vertex/Fragment Shader #pragma vertex vert Полный контроль над рендером
Post-processing Shader OnRenderImage() Эффекты на изображение камеры
Shader Graph (URP/HDRP) Визуально Визуальное создание без кода

Принцип написания любого шейдера:

  1. Определи задачу — что шейдер должен делать? (изменять цвет, добавлять свечения, искажения, эффект воды и т.д.)

  2. Выбери тип шейдера — Surface, Fragment/Vertex, Shader Graph или Post-Effect.

  3. Описывай свойства — для взаимодействия с инспектором или скриптами.

  4. Напиши логику — вершины (vert) и пиксели (frag), работа с текстурами, цветами, освещением.

  5. Компилируй и тестируй — в редакторе или Play Mode.

  6. Оптимизируй — по возможности упрощай расчеты, особенно для мобильных.

1. Шейдер (ShaderLab)

Создай новый файл 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 и прикрепи его к камере:

Как использовать:

  1. Прикрепи SCBEffect.cs к камере.

  2. Укажи или назначь в инспекторе созданный шейдер Custom/SaturationContrastBrightness.

  3. Регулируй параметры brightness, contrast, saturation.

Тема 4: Симуляция естественного освещения (дневные и ночные сцены)

Дневная сцена:

  • Один 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, правильное управление шейдерами и понимание сценических условий позволяет создавать сцены, которые не только выглядят реалистично, но и работают быстро даже на слабом железе.


Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Освещение локаций в играх и кинематографе

Термины: Освещение локаций в играх и кинематографе