Чтение онлайн

ЖАНРЫ

Графика DirectX в Delphi

Краснов Михаил

Шрифт:

// Переносим сферу по оси Y

matSphere._42 := -0.5;

end;

Я ввел в сцену четыре источника света. Три точечных источника предназначены для освещения стен комнаты, конус и сфера освещаются направленным источником света:

procedure TfrmDSD.SetupLights,

var

LightO : TD3DLight8;

Lightl : TD3DLight8;

Light2 : TD3DLight8;

Light3 : TD3DLight8;

begin

ZeroMemory(@LightO, SizeOf(LightO));

with LightO do begin

Type := D3DLIGHT POINT;

Diffuse.r := 0.4; //

Поскольку присутствует три источника,

Diffuse.g := 0.4; // их яркость задается небольшой

Diffuse.b := 0.4;

Specular := Diffuse;

Ambient := Diffuse;

Position := D3DVector(0.5, 0.75, 1.5);

AttenuationO := 1.0;

Attenuationl := 1.0;

Attenuation2 := 0.0;

Range := 2.56; end;

ZeroMemory(@Light1, SizeOf(Light1));

with Lightl do begin

_Type := D3DLIGHT_POINT;

Diffuse.r := 0.4;

Diffuse.g := 0.4;

Diffuse.b := 0.4;

Specular := Diffuse;

Ambient := Diffuse;

Position := D3DVector(0.5, 0.3, 0.3);

AttenuationO := 1.0;

Attenuationl := 1.0;

Attenuation2 := 0.0;

Range := 2.5;

end;

ZeroMemory(@Light2, SizeOf(Lightl));

with Light2 do begin

_Type := D3DLIGHT_POINT;

Diffuse.r := 0.4;

Diffuse.g := 0.4;

Diffuse.b := 0.4;

Specular := Diffuse;

Ambient := Diffuse;

Position := DSDVector(0.5, -0.3, 0.3);

AttenuationO := 1.0;

Attenuationl := 1.0;

Attenuation2 := 0.0;

Range := 2.5;

end;

// Один направленный источник света

Lights:=InitDirectionalLight(DSDVector(-0.5, -0.5, -1),

1.0, 1.0, 1.0, 0);

// Источники только инициализируются, но пока не включаются

with FDSDDevice do begin SetLight(0, LightO);

SetLight(1, Lightl);

SetLight(2, Light2);

SetLight(3, Light3);

end;

end;

При рисовании объектов включаем только определенные источники света:

procedure TfrmD3D.DrawScene;

begin

// Стены комнаты - 10 независимых треугольников

with FD3DDevice do begin

// Матрица идентичности возвращает в мировую систему координат

SetTransform(D3DTS_WORLD, IdentityMatrix);

SetMaterial(Materialwhite); // Стены из белого материала

LightEnable(0, True); // Работают только точечные источники

LightEnabled, True);

LightEnable (2, True);

LightEnable(3, False); // Направленный источник выключаем

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 10);

end;

// Конус и сфера освещаются только направленным источником with FDSDDevice do begin

LightEnable(0, False);

LightEnabled, False);

LightEnable(2, False);

LightEnable(3, True);

SetMaterial(MaterialConus); // Синий материал конуса

SetTransform(D3DTS_WORLD, matCone); // Неизменное положение конуса

DrawPrimitive(D3DPTJTRIANGLEFAN, 30, 49); //

Сам конус

DrawPrimitive(D3DPT_TRIANGLEFAN, 81, 49); // Основание конуса

end;

// Перемещаем сферу в новое положение

matSphere._41 := cos (Angle) / 2; // Меняем только два элемента

matSphere._43 := sin (Angle) / 2; // текущей матрицы трансформаций

// Вывод сферы; источник света - текущий, направленный

with FDSDDevice do begin

// Переносим систему координат

SetTransform(D3DTS_WORLD, matSphere);

SetMaterial(MaterialSphere) ;

DrawPrimitive(D3DPTJFRIANGLELIST, 30 + 51 + 51, 1200);

end;

end;

Обратите внимание, что среди задаваемых режимов воспроизведения появилось что-то новое для нас.

with FD3DDevice do begin

// Все вершины примитивов перечисляются по часовой стрелке

SetRenderState(D3DRS_CULLMODE, D3DCOLL_CCW);

SetRenderState(D3DRS_ZENABLE, D3DZBJTRUE);

SetRenderState(D3DRS_AMBIENT, S00202020);

SetRenderState{D3DRS_LIGHTING, Dword (True));

// Конус масштабируется, поэтому включаем пересчет нормалей

SetRenderState(D3DRS_NORMALIZENORMALS, DWORD (True));

end;

Включение режима DSDRS_AMBIENT равносильно включению дополнительного источника света, эмулирующего окружающую среду. Свет этого рассеянного источника излучается из всех направлений. Предназначен такой источник для передачи присутствия на сцене, в данном случае, воздуха, в котором лучи света рассеиваются во всех направлениях.

Записи, определяющие источник света и материал, содержат поля Diffuse, Ambient и specular. Первая структура соответствует диффузным свойствам объекта: для источника света это светофильтр, накладываемый на него; для материала это непосредственно цвет материала, та составляющая падающего света, которая не поглощается поверхностью. Это самая весомая составляющая получающегося цвета. Вторая, рассеянная составляющая проявляется в областях, примыкающих к области, на которую непосредственно падает свет. Используется она в комбинации с третьей, зеркальной составляющей для передачи таких свойств, как гладкость или матовость. Комбинируя значения этих составляющих, можно получать яркие или тусклые блики на поверхности объекта.

Разницы в том, задаются оптические свойства материала или источника, нет, но вы можете комбинировать свойства источника и материала для того, чтобы передать, что на сцене присутствуют, например, светящиеся объекты и объекты с обычными свойствами.

Проект из каталога Ех03 наглядно демонстрирует смысл атрибутов свойств материала и источника света. Это развитие примера с тором. Теперь мы можем произвольно задавать значения всех параметров (рис. 10.3).

<
Поделиться с друзьями: