Михаил Краснов - Графика DirectX в Delphi

Тут можно читать онлайн Михаил Краснов - Графика DirectX в Delphi - бесплатно ознакомительный отрывок. Жанр: comp-programming. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика DirectX в Delphi
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.56/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Михаил Краснов - Графика DirectX в Delphi краткое содержание

Графика DirectX в Delphi - описание и краткое содержание, автор Михаил Краснов, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика DirectX в Delphi - читать онлайн бесплатно ознакомительный отрывок

Графика DirectX в Delphi - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Михаил Краснов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Помимо положения, параметрами такого источника являются его интенсивность и ослабление. Интенсивность точечного источника - это его изначальная яркость, мощность. Явно она не задается, ее определяют значения цветовых составляющих поля Diffuse. Ослабление складывается из нескольких составляющих: область действия источника и коэффициенты, задающие закон ослабления освещенности. Область действия определяется линейной характеристикой, расстоянием. Все точки, расположенные от источника дальше этого расстояния, никак им не освещаются. Коэффициенты закона ослабления (их три) задают, как падает освещенность в пространстве. Первый коэффициент соответствует неизменному, постоянному освещению. Если установить такое правило, то, независимо от расстояния до источника света, все точки, попадающие в область освещения, освещаются одинаково. Второй коэффициент соответствует линейному затуханию. По мере удаления от источника света интенсивность освещения падает по линейному закону так, что на границе области его интенсивность становится нулевой. Последний коэффициент определяет квадратичное убывание интенсивности, степень падения освещенности - квадрат расстояния.

Коэффициенты задаются вещественными, обычно их значения нулевые или единичные. Самой распространенной схемой является линейный закон убывания, но вы можете строить и собственный, сложный закон освещенности, а не использовать определенную схему (если задать единичными все три коэффициента, интенсивность падает по полиномиальному закону).

Давайте закрепим пройденное, познакомившись с проектом каталога Ex01, в котором на экране рисуется тор. Во внутренней области тора перемещается точечный источник света, в точке его текущего положения рисуется сфера (рис. 10.1).

При инициализации такого источника нам необходимо самим заполнить все поля - фото 85

При инициализации такого источника нам необходимо самим заполнить все поля структуры TD3DLight8.

procedure TfrmD3D.SetupLights;

var

Material : TD3DMaterial8;

begin

Material := InitMaterial(1, 1, 0, 0); // Материал желтого цвета

FDSDDevice.SetMaterial(Material);

ZeroMemory(@Light, SizeOf(Light));

with Light do begin

_Type := D3DLIGHT_POINT; // Тип источника - точечный

Diffuse.R := 1.0; // Цвет источника

Diffuse.G := 1.0;

Diffuse.В := 1.0;

Specular := Diffuse; // Дополнительные параметры

Ambient := Diffuse;

Position := DSDVector(0.0, 0.0, 0.0); // Позиция в пространстве

AttenuationO := 1.0; // Коэффициенты закона ослабления

Attenuationl := 1.0;

Attenuation2 := 1.0;

Range := 2.5; // Расстояние, задающее область освещенности

end;

FD3DDevice.SetLight(0, Light);

FDSDDevice.LightEnable(0, True);

end;

Первое поле записи содержит константу, задающую тип источника. Структура Diffuse определяет цветовой фильтр, накладываемый на источник. Позиция источника света будет устанавливаться в текущей системе координат, ее значение остается действующим до следующего вызова метода SetLight (не обязательно заново инициализировать все поля структуры). Чтобы сфера освещалась так, как будто источник света находится внутри нее, необходимо переместить источник света в ее систему координат:

procedure TfrmD3D.DrawScene;

var

matTranslate, matScale : TDSDMatrix;

begin

// Вычисляем текущее положение источника

Light.Position := DSDVector(0.0, cos (Angle) * 2, 0.0);

with FDSDDevice do begin

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

SetTransform(D3DTS_WORLD, IdentityMatrix);

// Устанавливаем источник света в новом положении

SetLight(0, Light);

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 864); // Вывод тора

end;

// Источник света будет внутри сферы

Light.Position := D3DVector(0.О, 0.0, 0.0);

// Матрица трансформаций для сферы

SetTranslateMatrix(matTranslate, 0.0, cos (Angle) * 2, 0.0);

SetScaleMatrix(matScale, 0.1, 0.1, 0.1);

with FDBDDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matScale, matTranslate));

SetLight(0, Light);

DrawPrimitive(D3DPT_TRIANGLELIST, 864 * 3, 1200);

end;

end;

Позже мы подробнее поговорим о полях структуры, связанной с источником света, а сейчас попробуем построить модель комнаты, чтобы убедиться, что использование точечного источника света значительно повышает реализм изображений. В проекте каталога Ех02 рисуется комната, в ее центре находится конус, вокруг которого вращается сфера (рис. 10.2).

Матрицы трансформаций полностью заполняются один раз в начале работы - фото 86

Матрицы трансформаций полностью заполняются один раз, в начале работы приложения:

procedure TfrmD3D.FormCreate(Sender: TObject);

var

hRet : HRESULT;

matView, matProj : TD3DMatrix;

matRotate, matTranslate, matScale : TD3DMatrix;

begin

hRet := InitDSD;

if Failed (hRet) then ErrorOut ('InitDBD', hRet);

hRet := InitVB;

if Failed (hRet) then ErrorOut ( ' InitVertex' , hRet);

// Голубоватый материал конуса

MaterialConus := InitMaterial(0, 0.5, 1, 0) ;

// Белый материал стен комнаты

MaterialWhite := InitMaterial(1, 1, I, 0);

// Светло-коричневый материал сферы

MaterialSphere := InitMaterial(1, 0.5, 0, 0) ;

// Точка зрения задается один раз

SetViewMatrix(matview, D3DVector(0, 0, 2.577), D3DVector(0, 0, -5),

D3DVector(0, 1, 0));

FD3DDevice.SetTransform(D3DTS_VIEW, matView);

// Матрица проекций

SetProjectionMatrix (matProj, 1, 1, 1, 10);

FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);

// Инициализация источников света

SetupLights;

// Поворот конуса вокруг оси X

SetRotateXMatrix(matRotate, -Pi / 2);

// Переносим конус, его вершина в центре сцены

SetTranslateMatrixfmatTranslate, 0.0, -1.0, 0.0);

// Масштабируем конус

SetScaleMatrixfmatScale, 0.25, 1.0, 0.2);

// Матрица трансформаций конуса вычисляется один раз

matCone := MatrixMul(matScale, MatrixMul(matTranslate, matRotate));

// Инициализация матрицы трансформаций сферы

matSphere := IdentityMatrix;

// Переносим сферу по оси 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

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Михаил Краснов читать все книги автора по порядку

Михаил Краснов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика DirectX в Delphi отзывы


Отзывы читателей о книге Графика DirectX в Delphi, автор: Михаил Краснов. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x