5 января 2010 в 13:46
Уроки Direct3D - 1.2. Материал
Обратили внимание на то, что поле Color в формате вертекса стало явно избыточным? Если во все вертексы все равно пишется одно и то же значение цвета, то может можно его туда не писать вообще, а задать цвет как-то по другому? DirectX предоставляет такую возможность – это использование материала.
Уберем из формата вертекса поле Color, а также все, что с ним в программе было связано.!cut! Не буду уточнять, мы уже меняли формат вертекса неоднократно. Добавим в проект новую процедуру InitMaterial:
Private Sub InitMaterial() Dim Mat As D3DMATERIAL8 Mat.diffuse.r = 1 Mat.diffuse.g = 1 Mat.diffuse.b = 1 d3dDevice.SetMaterial Mat End Sub
Переменная структурного типа D3DMATERIAL8 заполняется параметрами используемого материала и с помощью d3dDevice.SetMaterial мы даем указание этот материал использовать. Параметры материала неизменны, поэтому достаточно вызвать InitMaterial один раз. Поместим вызов перед главным циклом. Остановим для разнообразия вращение света и заставим вращаться саму карту. Тогда и вызов InitLight можно переместить из главного цикла в начало. Программа готова – можно запускать.
Использование материала вместо цвета в вертексе с одной стороны немного ограничило наши возможности – теперь мы не можем задать каждому вертексу свой цвет, с другой стороны у нас появились и новые возможности. Добавим к инициализации материала строку:
Mat.Ambient = Mat.diffuse
Ambient, как и diffuse – это тоже цвет, но не направленный, а рассеянный. Заполнив поле Ambient у источника света, мы заставим равномерно светиться даже затененные участки. Можно не трогать источник света, а задать общий рассеянный свет. Добавьте в D3DInit еще одну строку:
d3dDevice.SetRenderState D3DRS_AMBIENT, &H302080
Теперь при запуске мы видим, что затененные участки карты не черные, а темно синие. Довольно похоже на снег.
Пример использования материала находится в папке Pr10. Попробуйте, изменяя цвет света и материала, добиться различных оттенков, чтобы почувствовать работу света.
Ну и проведем еще один эксперимент на нашей карте – покроем ее текстурой. Добавьте в вертекс текстурные координаты:
Private Type vFormat Pos As D3DVECTOR Normal As D3DVECTOR tu As Single tv As Single End Type
Так же добавьте все, что необходимо для создания, использования и удаления текстуры. Текстуру травы можно взять в папке Pr11. Текстурные координаты поставим в зависимость от координат x и z:
Vert(x + z * 64) = Vertex(x - 31.5, b * 0.03, z - 31.5, x * 0.02, z * 0.02)
Последние два параметра в функции Vertex – это и есть текстурные координаты.
Мы получили изображение поверхности земли, покрытой травой. Формат вертекса, используемый в этом проекте, является одним из наиболее часто применяемых в Direct3D. Соответствующее ему флаговое описание – комбинация трех констант D3DFVF_XYZ Or D3DFVF_NORMAL Or D3DFVF_TEX1 даже имеет отдельное обозначение – константа D3DFVF_VERTEX.
19 декабря 2016 в 11:14
I get that looks nice migraine painhttp://cia5purchase.com/ , overseas for thin Well the hair the.
авторизуйтесь
или войдите через