Ничто так не добавляет трёхмерной сцене реалистичности, как текстуры. В этой части учебника мы переделаем программу, созданную в прошлой части, удалим из неё всё связанное с освещением, но добавим использование текстур.
Начнём с того, что в код модуля формы вставим следующие объявления:
Dim g_D3DX As New D3DX8
Dim g_Texture As Direct3DTexture8
Класс D3DX8 содержит массу полезных методов, в том числе и для работы с текстурами. Объект g_Texture будет содержать текстуру, которую мы создадим позже.
В очередной раз изменим пользовательский тип трёхмерных вершин CUSTOMVERTEX. Теперь объявления этого типа и константы, его описывающей будут выглядеть так:
Private Type CUSTOMVERTEX
Position As D3DVECTOR '3d координаты вершины.
color As Long 'Цвет вершины.
tu As Single 'Координата текстуры.
tv As Single 'Координата текстуры.
End Type
Const D3DFVF_CUSTOMVERTEX = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_TEX1)
Теперь заменим код функции InitGeometry следующим:
Function InitGeometry() As Boolean
On Local Error Resume Next
Set g_Texture = g_D3DX.CreateTextureFromFile(g_D3DDevice, App.Path + "\banana.jpg")
If g_Texture Is Nothing Then Exit Function
Dim Vertices(99) As CUSTOMVERTEX
Dim VertexSizeInBytes As Long
VertexSizeInBytes = Len(Vertices(0))
Dim i As Long
Dim Theta As Single
For i = 0 To 49
Theta = (2 * g_pi * i) / (50 - 1)
Vertices(2 * i + 0).Position = vec3(Sin(Theta), -1, Cos(Theta))
Vertices(2 * i + 0).color = &HFFFFFFFF 'белый.
Vertices(2 * i + 0).tu = i / (50 - 1)
Vertices(2 * i + 0).tv = 1
Vertices(2 * i + 1).Position = vec3(Sin(Theta), 1, Cos(Theta))
Vertices(2 * i + 1).color = &HFF808080 'серый.
Vertices(2 * i + 1).tu = i / (50 - 1)
Vertices(2 * i + 1).tv = 0
Next
Set g_VB = g_D3DDevice.CreateVertexBuffer(VertexSizeInBytes * 100, _
0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT)
If g_VB Is Nothing Then Exit Function
D3DVertexBuffer8SetData g_VB, 0, VertexSizeInBytes * 100, 0, Vertices(0)
InitGeometry = True
End Function
Объект g_Texture заполняется данными с помощью метода CreateTextureFromFile объекта g_D3DX, возвращаюшего объект-текстуру. Первый параметр этого метода - устройство рендеринга, для которого предназначена создаваемая текстура; второй параметр - строка, содержащая имя файла, из которого будет создана текстура.
В данном примере для создания текстуры используется файл banana.jpg, Вы же можете использовать любой другой файл с расширением bmp, jpg и т. д, содержащий растровое изображение.
Далее функция InitGeometry практически не изменилась, за исключением того, что в алгоритме, создающем циллиндр добавились строки задающие координаты текстуры, традиционно обозначающиеся как tu и tv. Координаты текстуры определяют как она покрывает поверхность объектов. Координаты текстуры могут иметь значение в диапазоне от 0.0 до 1.0. При этом (0.0, 0.0) значит верхний левый угол текстуры, а (1.0, 1.0) - нижний правый.
Удалите процедуру SetupLights, а также вызов этой процедуры из процедуры Render, так как мы не используем трёхмерное освещение и материалы.
Добавьте также в функцию InitD3d строку, отключающую использование 3d освещения:
g_D3DDevice.SetRenderState D3DRS_LIGHTING, 0
В процедуру Render, после метода BeginScene добавьте этот код:
g_D3DDevice.SetTexture 0, g_Texture
g_D3DDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
g_D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
g_D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE
g_D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE
Первая строка применяет к устройству рендеринга текстуру g_Texture, присваивая ей индекс 0 (одновременно к устройству рендеринга может быть пременено до 8 текстур). Теперь все примитивы будут прорисоваваться с использованием этой текстуры. Следующие четыре строки устанавливают различные параметры текстуры с индексом 0.
Так как мы стали использовать новые объекты, код процедуры CleanUp, удаляющей их, тоже изменился. Вот он:
Public Sub CleanUp()
Set g_Texture = Nothing
Set g_VB = Nothing
Set g_D3DDevice = Nothing
Set g_D3D = Nothing
End Sub
Вот всё и готово. Запустив программу на выполнение, Вы увидите циллиндр с наложенной на него текстурой.
Вы можете скачать архив RAR с готовым проектом (45 Кб). В архиве есть также файл banana.jpg.
В следующей части учебника мы познакомимся c .x файлами и научимся загружать 3d объекты из них в сцену.