| netlib.narod.ru | < Назад | Оглавление | Далее > |
Direct3D поддерживает источники света трех типов.
Точечный свет (point light) — У этого источника света есть местоположение в пространстве и он испускает свет во всех направлениях.
![]() |
Рис. 5.4. Точечный свет |
Направленный свет (directional light) — У этого источника света нет местоположения, он испускает параллельные световые лучи в заданном направлении.
![]() |
Рис. 5.5. Направленный свет |
Зональный свет (spot light) — Источник света данного типа похож на фонарик; у него есть местоположение и он испускает конический сноп лучей в заданном направлении. Световой конус характеризуется двумя углами — φ и θ. Угол φ задает размер внутреннего конуса, а угол θ — внешнего.
![]() |
Рис. 5.6. Зональный свет |
В коде источники света представляются структурой D3DLIGHT9.
typedef struct _D3DLIGHT9 {
D3DLIGHTTYPE Type;
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Ambient;
D3DVECTOR Position;
D3DVECTOR Direction;
float Range;
float Falloff;
float Attenuation0;
float Attenuation1;
float Attenuation2;
float Theta;
float Phi;
} D3DLIGHT9;
Type — Задает тип источника света и может принимать одно из трех значений: D3DLIGHT_POINT, D3DLIGHT_SPOT или D3DLIGHT_DIRECTIONAL.
Diffuse — Цвет рассеиваемой составляющей испускаемого источником света.
Specular — Цвет отражаемой составляющей испускаемого источником света.
Ambient — Цвет фоновой составляющей испускаемого источником света.
Position — Вектор, задающий местоположение источника света в пространстве. Для направленного света значение не используется.
Direction — Вектор, задающий направление, в котором распространяется свет. Для точечного света не используется.
Range — Максимальное расстояние, на которое может распространиться свет прежде чем окончательно потухнет. Значение не может быть больше чем √FLT_MAX и не оказывает влияния на направленный свет.
Falloff — Значение используется только для зонального света. Оно определяет как меняется интенсивность света в пространстве между внутренним и внешним конусами. Обычно этому параметру присваивают значение 1.0f.
Attenuation0, Attenuation1, Attenuation2 — Переменные затухания, определяющие как меняется интенсивность света с увеличением расстояния до источника света. Эти переменные используются только для точечного и зонального света. Переменная Attenuation0 задает постоянное затухание, Attenuation1 — линейное затухание и Attenuation2 — квадратичное затухание. Вычисления выполняются по формуле

где D — это расстояние от источника света, а A0, A1, A2 соответственно Attenuation0, Attenuation1 и Attenuation2.
Theta — Используется только для зонального света; задает угол внутреннего конуса в радианах.
Phi — Используется только для зонального света; задает угол внешнего конуса в радианах.
Подобно инициализации структуры D3DMATERIAL9, в том случае, когда нам нужны только простые источники света, инициализация структуры D3DLIGHT9 становится рутинным занятием. Поэтому для инициализации простых источников света мы добавим в файлы d3dUtility.h/cpp следующие функции:
namespace d3d
{
.
.
.
D3DLIGHT9 InitDirectionalLight(D3DXVECTOR3* direction,
D3DXCOLOR* color);
D3DLIGHT9 InitPointLight(D3DXVECTOR3* position,
D3DXCOLOR* color);
D3DLIGHT9 InitSpotLight(D3DXVECTOR3* position,
D3DXVECTOR3* direction,
D3DXCOLOR* color);
}
Реализация этих функций не содержит сложных моментов. Мы рассмотрим только реализацию InitDirectionalLight. Остальные функции похожи на нее:
D3DLIGHT9 d3d::InitDirectionalLight(D3DXVECTOR3* direction,
D3DXCOLOR* color)
{
D3DLIGHT9 light;
::ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Ambient = *color * 0.4f;
light.Diffuse = *color;
light.Specular = *color * 0.6f;
light.Direction = *direction;
return light;
}
Теперь для создания источника направленного света белого цвета, испускающего лучи вдоль оси X в положительном направлении, можно написать:
D3DXVECTOR3 dir(1.0f, 0.0f, 0.0f); D3DXCOLOR c = d3d::WHITE; D3DLIGHT9 dirLight = d3d::InitDirectionalLight(&dir, &c);
После того, как мы инициализировали экземпляр D3DLIGHT9, нам надо зарегистрировать его во внутреннем списке управляемых Direct3D источников света. Делается это вот так:
Device->SetLight(
0, // устанавливаемый элемент списка источников света, диапазон 0 - maxlights
&light);// адрес инициализированной структуры D3DLIGHT9
После регистрации источника света мы можем включать его и выключать, как показано в приведенном ниже фрагменте кода:
Device->LightEnable(
0, // Включаемый или выключаемый источник света в списке
true); // true = включить, false = выключить
| netlib.narod.ru | < Назад | Оглавление | Далее > |