Модели освещения: 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 компонент.
Решение:
- Берем цвет материала: (0.0, 0.0, 1.0)
- Умножаем на intensity: 0.3 × (0.0, 0.0, 1.0)
- Получаем: (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 компонент.