Туториал №2. Вершины.
Для этого туториала за основу возьмем предидущий пример.
Приводить буду только изменения.
1. Создайте новый проект, как в предидущем примере, только класс назовите не
CreateDevice а
Vertices.
2. Нам понадобится еще один глобальный объект -
буфер вершин.
Private vertexBuffer As vertexBuffer = Nothing
(думаю понятно куда это вставить)
3. Теперь нам необходимо проинициализировать буфер, задать координаты вершин и т.д. для этого напишем еще две процедуры, одна будет вызываться после инициализации устройства Direct3D:
Public Function InitializeGraphics() As Boolean
Try
' Здесь давайте проинициализируем D3D устройство
Dim presentParams As New PresentParameters
presentParams.Windowed = True
presentParams.SwapEffect = SwapEffect.Discard
device = New Device(0, DeviceType.Hardware, Me, _
CreateFlags.SoftwareVertexProcessing, presentParams)
'Вызываем функцию, в которой мы проинициализируем буфер вершин
'и добавим для ему событие OnCreate и занесем в него информацию о трех вершинах
Me.OnCreateDevice(device, Nothing)
Return True
Catch e As DirectXException
Return False
End Try
End Function
а другая будет событием, которое буде выполнться для заполения буфера вершинами и при изменени размера окна (как доконца в этом разберусь, так расскажу почему это нужно).
Public Sub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs)
Dim dev As Device = CType(sender, Device)
' Здесь создаем буфер для 3-х вершин
vertexBuffer = New VertexBuffer(GetType(CustomVertex.TransformedColored), _
3, dev, 0, CustomVertex.TransformedColored.Format, Pool.Default)
'Добавляем обработчик события OnCreateVertexBuffer для события
'Created буфера вершин
AddHandler vertexBuffer.Created, AddressOf Me.OnCreateVertexBuffer
Me.OnCreateVertexBuffer(vertexBuffer, Nothing)
End Sub
Public Sub OnCreateVertexBuffer(ByVal sender As Object, ByVal e As EventArgs)
Dim vb As VertexBuffer = CType(sender, VertexBuffer)
Dim verts As CustomVertex.TransformedColored() = CType(vb.Lock(0, 0), _
CustomVertex.TransformedColored())
verts(0).X = 150 : verts(0).Y = 50 : verts(0).Z = 0.5F : verts(0).Rhw = 1
verts(0).Color = System.Drawing.Color.Aqua.ToArgb()
verts(1).X = 250 : verts(1).Y = 250 : verts(1).Z = 0.5F : verts(1).Rhw = 1
verts(1).Color = System.Drawing.Color.Brown.ToArgb()
verts(2).X = 50 : verts(2).Y = 250 : verts(2).Z = 0.5F : verts(2).Rhw = 1
verts(2).Color = System.Drawing.Color.LightPink.ToArgb()
vb.Unlock()
End Sub
4. Настало время визуализировать наши вершины на экране. Для этого модифицируем процедуду
Render() следующим образом:
Private Sub Render()
If device Is Nothing Then
Return
End If
'Очистка заднего буфера синим цветом
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)
device.BeginScene() 'Начало сцены
'Выбираем источник вершин
device.SetStreamSource(0, vertexBuffer, 0)
'Задаем формат вершин
device.VertexFormat = CustomVertex.TransformedColored.Format
'Визуализируем один треугольник
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)
device.EndScene() 'Конец сцены
device.Present() 'Смена буферов
End Sub
Все можно запускать.
На экране пояаится треугольник, раскрашенный 3-мя цветами (голубой, коричневый и розовый).
В аттаче вы найдете готовый проект (скомпилированный файл и исходники).