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

на главную

Жанры

Графика DirectX в Delphi

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

Шрифт:

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).

При нажатии кнопок вызывается стандартный диалог задания цвета. Выбранный пользователем цвет устанавливается в качестве параметров источника света или материала. Обратите внимание, как подготавливается диалог:

procedure TfrmD3D.Button2Click(Sender: TObject);

begin

// Предоставляем пользователю увидеть установленный диффузный цвет

ColorDialogl.Color :=

Round(MaterialTorus.Diffuse.R * 255) +

Round(MaterialTorus.Diffuse.G * 255 * $100) +

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9