Модели освещения: ambient, diffuse, specular

Что такое модели освещения? 🎯

Представь, что ты создаёшь 3D-мир в своей игре. Без света все объекты будут выглядеть плоскими и неинтересными — просто одноцветные силуэты. Модели освещения — это математические формулы, которые помогают компьютеру рассчитать, как свет должен взаимодействовать с поверхностями объектов, чтобы создать реалистичную картинку.

Мы разберём три основные составляющие, которые вместе создают полноценное освещение:

  • Ambient — фоновое освещение
  • Diffuse — рассеянный свет
  • Specular — блики
💡 Совет: Думай об этих компонентах как о слоях — сначала добавляем базовое освещение, затем рассеянный свет и в конце блики для реализма.


Ambient Lighting — Фоновое освещение 🌄

Это самый простой тип освещения. Ambient — это базовый уровень света, который равномерно освещает все объекты на сцене, даже те, что находятся в тени. Он имитирует рассеянный свет, который отражается от окружающих поверхностей.

Формула ambient освещения очень проста:

Ambient = Ambient_Intensity × Material_Color

Где:

  • Ambient_Intensity — сила фонового освещения (обычно значение от 0.0 до 1.0)
  • Material_Color — цвет материала объекта

Пример расчета:

Ambient_Intensity = 0.2
Material_Color = (1.0, 0.5, 0.0) # Оранжевый цвет
Ambient = 0.2 × (1.0, 0.5, 0.0) = (0.2, 0.1, 0.0)

Как видишь, объект будет слабо освещен оранжевым светом даже если на него не падает прямой свет от источников.


Diffuse Lighting — Рассеянный свет 💡

Diffuse освещение зависит от направления света и ориентации поверхности. Оно создает основную видимость формы объекта — чем больше поверхность повёрнута к свету, тем ярче она освещается.

Ключевая концепция здесь — нормаль поверхности и направление света.

Формула diffuse освещения:

Diffuse = Light_Color × Material_Color × max(0, dot(N, L))

Где:

  • N — вектор нормали поверхности (перпендикуляр к поверхности)
  • L — нормализованный вектор направления к источнику света
  • dot(N, L) — скалярное произведение векторов
🎯 Запомни: Скалярное произведение показывает, насколько два вектора направлены в одну сторону. Если dot(N, L) = 1 — поверхность смотрит прямо на свет, если 0 — перпендикулярна, если отрицательное — отвернута от света.

Угол между нормалью и светом Результат dot(N, L) Яркость освещения
0° (совпадают) 1.0 Максимальная
45° ≈0.7 Высокая
90° (перпендикулярны) 0.0 Нулевая
135° ≈-0.7 Нулевая (max(0, -0.7) = 0)

Specular Lighting — Блики ✨

Specular компонент создает яркие блики на блестящих поверхностях. Эти блики зависят от положения наблюдателя (камеры) и направления отражения света.

Формула specular освещения:

Specular = Light_Color × Specular_Intensity × pow(max(0, dot(R, V)), Shininess)

Где:

  • R — отраженный вектор света
  • V — вектор направления к наблюдателю (камере)
  • Shininess — коэффициент блеска (чем больше, тем уже и ярче блик)

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


Объединяем все компоненты 🎨

Полная модель освещения Фонга (Phong) выглядит так:

Final_Color = Ambient + Diffuse + Specular

Давай рассмотрим на конкретном примере:

// Параметры
Ambient_Intensity = 0.2
Light_Color = (1.0, 1.0, 1.0) // Белый свет
Material_Color = (0.0, 0.8, 0.0) // Зеленый материал
Specular_Intensity = 0.5
Shininess = 32

// Расчет для конкретной точки
dot(N, L) = 0.8
dot(R, V) = 0.9

// Вычисляем компоненты
Ambient = 0.2 × (0.0, 0.8, 0.0) = (0.0, 0.16, 0.0)
Diffuse = (1.0, 1.0, 1.0) × (0.0, 0.8, 0.0) × 0.8 = (0.0, 0.64, 0.0)
Specular = (1.0, 1.0, 1.0) × 0.5 × pow(0.9, 32) ≈ (1.0, 1.0, 1.0) × 0.5 × 0.034 ≈ (0.017, 0.017, 0.017)

// Итоговый цвет
Final_Color = (0.0, 0.16, 0.0) + (0.0, 0.64, 0.0) + (0.017, 0.017, 0.017) = (0.017, 0.817, 0.017)

Как видишь, мы получили ярко-зеленую поверхность с небольшим белым бликом.


Практические задачи 🧮

Задача 1: Расчет ambient компонента

Условие: Объект имеет синий цвет (0.0, 0.0, 1.0). Intensity фонового освещения равен 0.3. Рассчитай ambient компонент.

Решение:

  1. Берем цвет материала: (0.0, 0.0, 1.0)
  2. Умножаем на intensity: 0.3 × (0.0, 0.0, 1.0)
  3. Получаем: (0.0, 0.0, 0.3)

Ответ: Ambient = (0.0, 0.0, 0.3)

Задача 2: Расчет diffuse компонента

Условие: Красный материал (1.0, 0.0, 0.0), белый свет (1.0, 1.0, 1.0). Угол между нормалью и светом такой, что dot(N, L) = 0.6. Рассчитай diffuse компонент.

Скрыть рекламу навсегда

🌱 Индвидидулаьные занятия

Индивидуальные онлайн-занятия по программированию для детей и подростков

Личный подход, без воды, с фокусом на понимание и реальные проекты.

🚀 Записаться на занятие