DirectX & Visual Basic

Учебник DirectX Graphics: часть 5

<<Предыдущая часть

Использование текстур

Ничто так не добавляет трёхмерной сцене реалистичности, как текстуры. В этой части учебника мы переделаем программу, созданную в прошлой части, удалим из неё всё связанное с освещением, но добавим использование текстур.

Начнём с того, что в код модуля формы вставим следующие объявления:

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 объекты из них в сцену.

Следующая часть>>

Hosted by uCoz