Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1431 / 183 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 7:

Освещенность и материалы. Построения объектов

Задавая параметры структуры D3DMATERIAL9, тем самым мы определяем свойства поверхности отображаемого объекта. Процесс создания и использование (назначение) материала включает в себя следующие шаги:

  1. Объявление переменной типа D3DMATERIAL9 ;
  2. Заполнение соответствующих полей данной структуры;
  3. Установка материала.

Программно эти шаги реализуются таким образом:

C++
D3DMATERIAL9 material;
ZeroMemory( &material, sizeof(D3DMATERIAL9) );
material.Diffuse=D3DXCOLOR(0.7f, 0.0f, 0.0f, 0.0f);
material.Ambient=D3DXCOLOR(0.2f, 0.0f, 0.0f, 0.0f);
material.Specular=D3DXCOLOR(0.1f, 0.0f, 0.0f, 0.0f);
...
device->SetMaterial( &material );
Pascal
var 
   material: TD3DMaterial9;
...
ZeroMemory(@material,SizeOf(TD3DMaterial9));
material.Diffuse:=D3DXColor(0.7, 0, 0, 0); // r, g, b, a
material.Ambient:=D3DXColor(0.2, 0, 0, 0);
material.Specular:=D3DXColor(0.1, 0, 0, 0);
...
device.SetMaterial(material);

Метод SetMaterial вызывается при выводе объектов (в процедуре рендеринга). Кроме определения свойств материала необходимо задать источники света. Библиотека Direct3D поддерживает три типа источника света:

  1. Параллельный (направленный) – этот тип не имеет определенного источника света, он как бы повсюду, но светит в одном направлении.

  2. Точечный – источник, светящий во всех направлениях (лампочка).

  3. Прожекторный (нацеленный) – тип, имеющий определенный источник света, но светящий в заданном направлении в виде направленного конуса (фонарик).

Свет в Direct3D состоит из трех составляющих: рассеянного, окружающего, зеркального, которые независимо друг от друга принимают участие в вычислении освещения граней. Они напрямую взаимодействуют с тремя цветами, определенными в свойствах материала. Результат такого сочетания (взаимодействия) и есть конечный цвет освещения сцены. В сценах Direct3D могут присутствовать до восьми различных по свойствам источников света. Для инициализации источника света в Direct3D необходимо проделать следующие шаги:

  1. Объявить переменную типа D3DLIGHT9 ;
  2. Указать тип источника и заполнить необходимые поля данной структуры;
  3. Включить (разрешить) освещенность в сцене;
  4. Установить источники света;
  5. Включить источники света.

Структура D3DLIGHT9 содержит следующие поля:

C++
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; {1/(A0+A1*D+A2*D^2),D–расстояние от источника}
  float Theta;  {внутренний угол источника света}
  float Phi;    {внешний угол, [0…pi]}
} D3DLIGHT9;
Pascal
TD3DLight9 = packed record
 _Type: TD3DLightType;     {тип источника света}
 Diffuse: TD3DColorValue;  {рассеянный свет, излучающий источником}
 Specular: TD3DColorValue; {зеркальный свет, излучающий источником}
 Ambient: TD3DColorValue;  {окружающий свет, излучающий источником}
 Position: TD3DVector;  {положение источника в сцене} для точечного
 Direction: TD3DVector;    {направление падающего света (вектор)}
 Range: Single;    {максимальное расстояние освещения} для точечного
 Falloff: Single;     {используется в прожекторном источнике}
 Attenuation0: Single;  {определяют закон изменения освещения}
 Attenuation1: Single;  {от параметра расстояния}
 Attenuation2: Single; {1/(A0+A1*D+A2*D^2),D–расстояние от источника}
 Theta: Single;          {внутренний угол источника света}
 Phi: Single;            {внешний угол, [0…pi]}
end;

Тип источника задается указанием одной из трех констант:

D3DLIGHT_POINT, // точечный источник
D3DLIGHT_SPOT,  // источник-прожектор
D3DLIGHT_DIRECTIONAL. // направленный источник

Ниже приведен пример установки направленного источника освещения в сцене.

C++
// создание и заполнение полей структуры, 
   установка типа источника
D3DLIGHT9 light;
ZeroMemory(&light, sizeof(D3DLIGHT9) );
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 0.0f);
light.Direction = D3DXVECTOR3(0.0f, 0.0f,1.0f);
...
// разрешаем работы с освещенностью
device->SetRenderState( D3DRS_LIGHTING, TRUE );
...
// установка и включение первого (и единственного)
   источника света device->SetLight( 0, &light );
device->LightEnable( 0, TRUE );
Pascal
var  light: TD3DLight9;
...
// создание и заполнение полей структуры, 
   установка типа источника
ZeroMemory(@light,SizeOf(TD3DLight9));
light._Type:=D3DLIGHT_DIRECTIONAL;
light.Diffuse:=D3DXColor(1,0,0,0);
light.Direction:=D3DXVector3(0,0,1);

// разрешаем работы с освещенностью
device.SetRenderState(D3DRS_LIGHTING, 1);
...

// установка и включение первого (и единственного) 
   источника света
device.SetLight(0,light);
device.LightEnable(0,true);