5.Освещение В данном разделе под освещением будем понимать расчет цвета(ов) вершины на основе свойств поверхности (материала) и источников света, освещающих объект.
5.1.Математика освещения В первую очередь рассмотрим модель освещения, принятую в Direct3D8. Цвет вершины определяется следующими четырьмя составляющими освещения: ambient (рассеянное освещение, диффузно отраженное от поверхности), diffuse (свет, диффузно отраженный от поверхности), specular (свет, зеркально отраженный от поверхности), emissive (свет, испускаемый самим материалом).
Перед тем, как перейти к рассмотрению формул, по которым вычисляются эти компоненты, введем следующие обозначения:
A, D, S, E – соответствуют значениям ambient, diffuse, specular и emissive у поверхности (индекс S) или у i-ого источника цвета (индекс Li). AG – соответствует глобальному рассеянному освещению (например, освещению от неба);
- значение степени Power в структуре D3DMATERIAL9 (см. раздел 5.2);
- нормаль в вершине;
- направление i-ого источника света для направленного и конусного источников;
- позиция i-ого источника света для точечного и конусного источников;
- позиция вершины;
- позиция камеры;
функция ;
- направление на наблюдателя;
- направление на источник (для направленного источника равна );
- функция затухания по расстоянию для точечного и конусного источников (для направленного равна 1);
- функция затухания по углу для конусного источника (для остальных равна 1).
Теперь можно записать составляющие освещения:
Функции затухания рассчитываются следующим образом
.
Здесь , ai0, ai1, ai2 – параметры затухания. Углы i, i – внешний и внутренний углы конусного источника, falloff – параметр, определяющий переход от светлой внутренней области, освещенной конусным источником к внешней темной. Его влияние редко заметно, поэтому обычно он устанавливается в 1 (тем более что возведение в степень в этих формулах изрядно замедляет скорость их вычисления).
Отметим определенную нетривиальность использования результата расчетов. В случае выключенного отраженного освещения все очевидно: результат расчетов это цвет diffuse в вершине равный ambient + diffuse + emissive. Однако если включить specular (как это сделать будет рассмотрено в пункте 5.2), то он не будет добавлен к diffuse (как это делается в Open GL), а будет записан в отдельный цвет specular, который интерполируется по треугольнику, так же как и diffuse. Разницу между Direct3D и OpenGL моделью можно заметить только при наличии текстурирования (будет рассмотрено в разделе 6) на этапе смешивания цвета освещения с цветом текстуры:
Direct3D модель: Res = Diffuse * Texture+Specular;
Open GL модель: Res = (Diffuse + Specular) * Texture.
Разница будет хорошо заметна при темной текстуре (Texture = 0.2). В случае Open GL модели максимально возможное значение Res будет 0.2, в то время как в Direct3D модели оно будет 1 для specular блика.
|