netlib.narod.ru< Назад | Оглавление | Далее >

5.4. Источники света

Direct3D поддерживает источники света трех типов.

В коде источники света представляются структурой 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;

Подобно инициализации структуры 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz