20 января 2010 в 13:37
Уроки Direct3D - 1.7. Текстурирование
Представьте, что нам нужно изобразить кирпичную стену. До сих пор мы рисовали цветные треугольники, очевидно, что при таком подходе для изображения стены понадобится огромное количество треугольников. Тут нам на помощь приходит текстурирование.
Определение<код на языке vb
Private Type vFormat
PosX As Single
PosY As Single
PosZ As Single
RHW As Single
tu As Single
tv As Single
End Type
И флаговое описание вертекса:
Private Const vFlag = D3DFVF_XYZRHW Or D3DFVF_TEX1
В формате вертекса исчез цвет, но появились два новых поля – tu и tv, это координаты на текстуре (отсчет идет от верхнего левого угла), отмечающие ту точку текстуры, которая будет отображаться на наш вертекс. Еще раз осмыслите разницу – это координаты не в пространстве, а на текстуре.
Для текстур в Direct3D существует специальный класс Direct3DTexture8.
Создадим переменную для экземпляра этого класса:
Dim Tex As Direct3DTexture8
Не забудьте внести соответствующую строку в ClearAll! Так же добавьте инициализацию уже знакомого нам D3DX, который поможет нам загрузить текстуру из файла:
Set Tex = d3dx.CreateTextureFromFile(d3dDevice, App.Path & "\brick.jpg")
В InitGeometry уберем строки, описывающие цвет вертексов и определим текстурные координаты:
Vert(0).tu = 0 Vert(0).tv = 0 Vert(1).tu = 1 Vert(1).tv = 0 Vert(2).tu = 0 Vert(2).tv = 1
Остается в Render добавить строку, указывающую нашему устройству рендера использовать именно эту текстуру:
d3dDevice.SetTexture 0, Tex
Файл brick.jpg" alt="Фото" /> можно взять с компакт-диска и поместить в папку с проектом. Запускаем проект и видим «кирпичный» треугольник. Текстурные координаты «0, 0» соответствуют верхнему левому, «1, 0» – верхнему правому, а «0, 1» – нижнему левому углам. Поменяйте текстурные координаты:
Vert(0).tu = -1
Vert(0).tv = -1
Vert(1).tu = 1.5
Vert(1).tv = -1
Vert(2).tu = -1
Vert(2).tv = 1.5
Этот опыт демонстрирует, что в качестве текстурных координат можно применять числа, выходящие из диапазона 0 .. 1, при этом текстура повторяется.
Если затекстурить несколько треугольников с общими вертексами, равномерно распределив по вертексам текстурные координаты, стыки между треугольниками будут незаметны. Возьмем цилиндр из нашего предыдущего проекта и внесем подобные изменения. Так же, как в проекте с треугольником, уберем цвет и добавим текстурные координаты в формат вертекса, изменим флаговое описание, добавим инициализацию и уничтожение текстуры. Стоит остановиться на инициализации геометрии. Функция Vertex теперь приобретет такой вид:
Private Function Vertex(X As Single, Y As Single, Z As Single, _ Tu As Single, Tv As Single) As vFormat Vertex.Pos = vec3(X, Y, Z) Vertex.Tu = Tu Vertex.Tv = Tv End Function А InitGeometry такой: Private Sub InitGeometry() Dim n As Long Set vBuffer = d3dDevice.CreateVertexBuffer(2 * 65 * vSize, 0, vFlag, D3DPOOL_DEFAULT) For n = 0 To 64 Vert(0) = Vertex(Sin(2 * Pi * n / 64), -1, Cos(2 * Pi * n / 64), 6 * n / 64, 2) Vert(1) = Vertex(Sin(2 * Pi * n / 64), 1, Cos(2 * Pi * n / 64), 6 * n / 64, 0) D3DVertexBuffer8SetData vBuffer, vSize * 2 * n, vSize * 2, 0, Vert(0) Next n End Sub
Текстурная координата Tv распределена пропорционально высоте цилиндра (координата Y), а Tu пропорционально углу относительно центральной оси. Посмотрите на результат и, ради тренировки, попробуйте покрыть цилиндр этой же текстурой под углом 45º таким образом, чтобы не осталось шва.
комментарии отсутствуют
авторизуйтесь