Direct3D для VB.NET Урок 16. Использование текстуры: часть 1
На прошлых занятиях мы сами задавали цвет вершин. Промежуточный же цвет внутри наших треугольников получался по некоторым формулам (как среднее цветов вершин). Разумеется, в реальном использовании это не слишком удобно - гораздо удобнее использовать для текстур некоторые картинки, которые просто натягиваются на нашу разбитую на треугольники модель. Вот как раз этим мы и займемся на этом уроке.
Вот план наших действий: сначала мы определим новый формат наших вершин. А именно укажем, что они будут использовать текстуры. Далее мы заведем в классе переменную типа Texture для текстуры. Потом мы загрузим некоторый файл с жесткого диска в эту переменную. Шаг следующий - мы должны переопределить в методе OnCreateVertexBuffer наши вершины (а именно кроме координат задать для них текстурные координаты - т. е. способ, которым текстура будет накладываться на конкретный треугольник в нашей модели). И, наконец, мы должы изменить отрисовку в методе Render - а именно установить загруженную из файла текстуру для нашего устройства и задать для нее некоторые параметры отображения.
Вот такой план. Приступаем к его осуществению.
Шаг первый - изменение формата наших вершин:
PublicSub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs)
...
' Задание формата вершин.
vertexBuffer = New VertexBuffer( _
GetType(CustomVertex.PositionNormalTextured), 3, dev, 0, _
CustomVertex.PositionNormalTextured.Format, Pool.Default)
...
EndSub
Обратите внимание, что тут мы используем для задания вершин тип CustomVertex.PositionNormalTextured. Именно такой тип должны иметь вершины для использования вершин.
Шаг второй и третий - объявление переменной для текстуры и загрузка в эту переменную текстуры из файла:
PublicClass Form1
Inherits System.Windows.Forms.Form
...
' Переменая для текстуры.Private texture As Texture = Nothing
...
PublicSub OnResetDevice(ByVal sender As Object, ByVal e As EventArgs)
...
' Загрузка текстуры из файла.
texture = TextureLoader.FromFile(device, "c:\tmp\dx.bmp")
EndSub
Разумеется, файл dx.bmp должен существовать. Формат его может быть и другим (jpg, gif и др.). Рекомендуется, что бы картинка в этом файле имела размеры, кратные степеням двойки (4, 8, 16, 32, 64 и т. п.).
Шаг четвертый - переопределение вершин в методе OnCreateVertexBuffer:
PublicSub OnCreateVertexBuffer _
(ByVal sender As Object, ByVal e As EventArgs)
Dim vb As VertexBuffer = CType(sender, VertexBuffer)
' Тут мы теперь используем тип PositionNormalTextured.Dim verts As CustomVertex.PositionNormalTextured() = _
CType(vb.Lock(0, 0), CustomVertex.PositionNormalTextured())
' Задание вершин в новом формате.' Первая вершина.
verts(0).SetPosition(New Vector3(-1.0F, -1.0F, 0.0F))
verts(0).SetNormal(New Vector3(1.0F, 0.0F, 0.0F))
verts(0).Tu = 0
verts(0).Tv = 0
' Вторая вершина.
verts(1).SetPosition(New Vector3(1.0F, -1.0F, 0.0F))
verts(1).SetNormal(New Vector3(1.0F, 0.0F, 0.0F))
verts(1).Tu = 1
verts(1).Tv = 1
' Третья вершина.
verts(2).SetPosition(New Vector3(0.0F, Math.Sqrt(3) - 1, 0.0F))
verts(2).SetNormal(New Vector3(1.0F, 0.0F, 0.0F))
verts(2).Tu = 1
verts(2).Tv = 0
vb.Unlock()
EndSub
Обратите внимание, что у наших вершин появились две новые переменные - Tu и Tv. Они как раз и определяют, как тестура натянется на наш треугольник. При этом точка (0, 0) - это левый верхий угол нашей в файле нашей текстуры, а (1, 1) - правый нижний. Т. е., например, тестура натянется на нулевую вершину нашего треугольника точкой (0, 0), а на вторую - точкой (1, 0).
Пожалуй, с этим уроком все. Остальные действия мы сделаем на следующием уроке.
PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru