Показать сообщение отдельно
Старый 19.03.2006, 22:39   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Туториал №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-мя цветами (голубой, коричневый и розовый).

В аттаче вы найдете готовый проект (скомпилированный файл и исходники).
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Лit}{Ъ (02.05.2011), Nex (29.05.2009)