Обратили внимание на то, что поле Color в формате вертекса стало явно избыточным? Если во все вертексы все равно пишется одно и то же значение цвета, то может можно его туда не писать вообще, а задать цвет как-то по другому? DirectX предоставляет такую возможность – это использование материала.
Уберем из формата вертекса поле Color, а также все, что с ним в программе было связано.!cut! Не буду уточнять, мы уже меняли формат вертекса неоднократно. Добавим в проект новую процедуру InitMaterial:

код на языке vb
 
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 можно переместить из главного цикла в начало. Программа готова – можно запускать.
Использование материала вместо цвета в вертексе с одной стороны немного ограничило наши возможности – теперь мы не можем задать каждому вертексу свой цвет, с другой стороны у нас появились и новые возможности. Добавим к инициализации материала строку:

код на языке vb
 
  Mat.Ambient = Mat.diffuse
 

Ambient, как и diffuse – это тоже цвет, но не направленный, а рассеянный. Заполнив поле Ambient у источника света, мы заставим равномерно светиться даже затененные участки. Можно не трогать источник света, а задать общий рассеянный свет. Добавьте в D3DInit еще одну строку:

код на языке vb
 
  d3dDevice.SetRenderState D3DRS_AMBIENT, &H302080
 

Теперь при запуске мы видим, что затененные участки карты не черные, а темно синие. Довольно похоже на снег.

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

Ну и проведем еще один эксперимент на нашей карте – покроем ее текстурой. Добавьте в вертекс текстурные координаты:

код на языке vb
 
Private Type vFormat
  Pos As D3DVECTOR
  Normal As D3DVECTOR
  tu As Single
  tv As Single
End Type
 

Так же добавьте все, что необходимо для создания, использования и удаления текстуры. Текстуру травы можно взять в папке Pr11. Текстурные координаты поставим в зависимость от координат x и z:

код на языке vb
 
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.