Источник света создается при помощи метода IDi rect3DDeviсе9 : SetLight ( ), в первом параметре которого указывается номер, идентифицирующий источник, а во втором параметре передается указатель на структуру D3DLIGHT9.
В листинге 23.10 приведен пример создания источника рассеянного и диффузного освещения.
Листинг 23.10
void CreateLight(void) {
D3DLIGHT9 light;
ZeroMemory( Slight. sizeof(D3DLIGHT9) ): light.Type - D3DLIGHT_DIRECTI0NAL;
light.Diffuse.r = 0.6f;
продолжение &
Применение библиотеки DirectX
Листинг 23.10 (продолжение)
light.Diffuse.g - 0.4f;
light.Diffuse.b - 0.4f;
light.Specular.r - 0.5;
light. Specular.g - 0.5;
light. Specular.b - 0.5;
light.Direction - D3DVECT0R3C.O.O.O.l.Of);
extern LPDIRECT3DDEVICE9'Device;
Device->SetLight(0. &light );
}
В данном случае поля структуры 1 ight, не используемые источником направленного света, и параметры рассеянного света заданы нулями.
Источник света создан, но его еще нужно будет включить. Это можно сделать в данной функции или управлять освещением в процессе вывода примитивов при помощи методов Device->LightEnablе(0.TRUE) и Device->LightEnablе(0. FALSE).
Заполнить модельный мир рассеянным светом можно и не создавая источников света. Для этого нужно лишь вызвать метод SetRenderState( ). Например, для создания серого рассеянного света нужно использовать следующую конструкцию:
Devi ce->SetRenderState(D3DRENDERSTATE_AMBIENT.
D3DC0L0R_RGBA(100.100.100,0));
Свойства материала задаются следующей структурой:
typedef struct _D3DMATERIAL9 {
D3DC0L0RVALUE Diffuse: D3DC0L0RVALUE Ambient; D3DC0L0RVALUE Specular; D3DC0L0RVALUE Emissive; float Power; } D3DMATERIAL9
Кроме уже рассмотренных полей Diffuse, Ambient и Specular, которые задают коэффициенты отражения света, созданного источником, существует поле Emi ssi ve, которое создает цвет, не зависящий от наличия источника освещения. Значения поля Emissive используются при определении результирующего цвета, даже когда нет источника освещения. Из физических соображений кажется странным наличие разных цветов Diffuse и Ambient для направленного и рассеянного света. Такое разделение не является общепринятым. В частности, при импорте средствами DirectX объектов, созданных редакторами 3DStudio, библиотека получает только компонент Diffuse. При этом разработчик приложения обычно выполняет запись в поле Ambient значения поля Diffuse.