Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Visual Basic > DirectX

Ответ
 
Опции темы
Старый 19.03.2006, 15:57   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Итак начнем.

Прежде всего нам понадобится конечно VB.NET (он входит в состав Visual Studio .NET) и DirectX9 SDK (скачать его можно тут правда он весит 222Мб, а вот тут есть ссырка на декабрьский SDK, который весит 320Мб), в котором есть все необходимые библиотеки для разработки приложений, исполльзующих DirectX.

В этом топике я буду публиковать стандартные туториалы по D3D, входящие в состав DX9 SDK. Все они написаны на VB.NET 2003 (7.1), но пойдут и на VB.NET 2002 (7.0) с некоторыми изменениями.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Лit}{Ъ (02.05.2011), Nex (29.05.2009)
Старый 19.03.2006, 16:29   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Туториал №1. Создание устройства Direct3D.

1. Создайте пустой проект VB.NET (Empty Project)

2. В окне Solution Explorer выберите пункт References, и в меню, вызываемом щелчком правой кнопки на этом пункте выберите Add Reference...

3. В открывшемся окне выбелите вкладку .NET и добавьте в проект ссылки на следующие библиотеки классов:
- System.dll
- System.Drawing.dll
- System.Windows.Forms.dll
- Microsoft.DirectX.dll
- Microsoft.DirectX.Direct3D.dll

Нажмите OK

4. Далее необходимо добавить в проект файл класса, для этого в меню Project выберите пункт Add New Item... и добавьте файл класса (Class) с названием CreateDevice.vb

5. Откройте добавленный файл для редактирования и вставьте следующий код:
'-----------------------------------------------------------------------------
' Файл: CreateDevice.vb
'
' Описание: Это первый туториал по использованию Direct3D. В в этом туториале,
'           все что мы сделаем это создадим устройство Direct3D и используем 
'           его для очистки окна.
'
' Copyright (c) Microsoft Corporation. Все права защищены.
'-----------------------------------------------------------------------------
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D


Public Class CreateDevice
    Inherits Form ' Наследуем класс формы

    ' Наши глобальные переменные для этого проекта
    Private device As device = Nothing ' Наше устройство рендеринга

    Public Sub New()
        ' Устанавливаем начальный размер нашей формы
        Me.ClientSize = New System.Drawing.Size(400, 300)
        ' и её название
        Me.Text = "D3D Tutorial 01: Создание устройства"
    End Sub


    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)
            Return True
        Catch e As DirectXException
            Return False
        End Try
    End Function

    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.EndScene() 'Конец сцены
        device.Present() 'Смена буферов (переднего и заднего)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Me.Render() ' Визуализация сцены при событии Paint
    End Sub

    Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If Asc(e.KeyChar) = CInt(System.Windows.Forms.Keys.Escape) Then
            Me.Close() ' Обработка клавиши Esc
        End If
    End Sub

    '<summary>
    'Главная точка входа в приложение
    '</summary>
    Shared Sub Main()

        Dim frm As New CreateDevice 'Создание экземпляга класса нашей формы
        If Not frm.InitializeGraphics() Then ' Инициализация Direct3D
            MessageBox.Show("Невозможно инициализировать Direct3D.  Программа будет закрыта.")
            Return
        End If
        frm.Show() 'Отображение нашей формы на экране

        'Главнцй цикл
        While frm.Created
            frm.Render()
            Application.DoEvents()
        End While
    End Sub
End Class
Можете запускать.
Результатом работы программы будет выводится форма, вся область которой будет очищаться синим цветом с помощью устройства Direct3D.

Краткое описание кода:
В коде создается новый класс CreateDevice, который является наследником класса System.Windows.Forms.Form. При запуске приложения выполняется процедура Sub Main(), которая является главной точкой входа в приложение. В ней происходит создание экземпляра класса CreateDevice, т.е. создание формы. В функции InitializeGraphics() происходит инициализация устройства Direct3D, которое одним из параметров получает ссылку на нашу форму (Me). Далее выполняется отображение формы на экране. И наконец, приложение переходит в главный цикл, условием завершения которого является уничтожение нашей формы. Вот и все.

Скомпилированный проект с исходником прикреплен ниже.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Лit}{Ъ (02.05.2011), Nex (29.05.2009)
Старый 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)
Старый 20.03.2006, 17:38   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Туториал №3. Матрицы.

В этом туториале Вы научитесь применять матрицы, необходимые для работы с 3D. Все описания этого туториала находятся в коде в виде коментариев. Сам код будет вам хорошо понятен, если вы читали предидущие два туториала
'-----------------------------------------------------------------------------
' Файл: Matrices.vb
'
' Описание: Сейчас мы знаем как создать устройство и визуализировать несколько 2D вершин,
'       в этом туториале мы сделаем следующий шаг в нашем обучении - визуалируем 3D геометрию.
'       Для этого нам придется использовать матрицы размером 4х4 для преобразования геометрии 
'       перемещением, вращением и масштабированием, а также настроим камеру.
'
'       Геометрия изменяется в "модельном" пространстве. Мы можем двигать её (translation),
'       вращать (rotation), или масштабировать (scaling) используя мировые преобразования.
'       Вся геометрия, как говорят, находится в мировом пространстве. Далее, нам необходимо
'       расположить камеру (или положение наших глаз) и задать направление взгляда (в нашем
'       случае это наша геометрия). Для этого используется видовая матрица. Она определяет
'       положение и вращение нашего взгляда. Последнее преобразование - преобразование геометрии
'       в видовом пространстве с помошью матрицы проекций. Это преобразование проецирует
'       3D сцену в нашу 2D область обзора (т.е. в форму).
'
'       Обратите внимание, что в этом туториале мы будем использовать библиотеку
'       классов D3DX, которая представляет собой набор
'       вспомогательных утилит для работы с D3D. В нашем случае, мы используем несколько
'       полезных функций для настройки матриц. Для использования библиотеки D3DX, просто
'       добавьте в проект ссылку на неё (Microsoft.DirectX.Direct3DX.dll).
'
' Copyright (c) Microsoft Corporation. Все права защищены.
'-----------------------------------------------------------------------------
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Direct3D = Microsoft.DirectX.Direct3D


Public Class Matrices
    Inherits Form
    ' Наши глобальные переменные для этого проекта
    Private device As device = Nothing ' Наше устройство рендеринга 
    Private vertexBuffer As vertexBuffer = Nothing 'Буфер вершин
    'Объект, содержащий параметры устройства вывода
    Private presentParams As New PresentParameters
    Private pause As Boolean = False

    Public Sub New()
        ' Устанавливаем начальный размер нашей формы 
        Me.ClientSize = New System.Drawing.Size(400, 300)
        ' и её название
        Me.Text = "Direct3D Tutorial 3 - Матрицы"
    End Sub


    Public Function InitializeGraphics() As Boolean
        Try
            ' Здесь давайте проинициализируем D3D устройство 
            presentParams.Windowed = True
            presentParams.SwapEffect = SwapEffect.Discard
            device = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)
            AddHandler device.DeviceReset, AddressOf Me.OnResetDevice
            Me.OnCreateDevice(device, Nothing)
            Me.OnResetDevice(device, Nothing)
            pause = False
            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.PositionColored), _
                    3, dev, 0, CustomVertex.PositionColored.Format, Pool.Default)
        AddHandler vertexBuffer.Created, AddressOf Me.OnCreateVertexBuffer
        Me.OnCreateVertexBuffer(vertexBuffer, Nothing)
    End Sub

    Public Sub OnResetDevice(ByVal sender As Object, ByVal e As EventArgs)
        Dim dev As Device = CType(sender, Device)
        ' Выключаем отсечение задних поверхностей геометрии
        dev.RenderState.CullMode = Cull.None
        ' Выключаем D3D освещение т.к. мы сами устанавливаем цвета вершин 
        dev.RenderState.Lighting = False
    End Sub

    Public Sub OnCreateVertexBuffer(ByVal sender As Object, ByVal e As EventArgs)
        Dim vb As VertexBuffer = CType(sender, VertexBuffer)
        Dim verts As CustomVertex.PositionColored() = CType(vb.Lock(0, 0), CustomVertex.PositionColored())
        verts(0).X = -1.0F
        verts(0).Y = -1.0F
        verts(0).Z = 0.0F
        verts(0).Color = System.Drawing.Color.DarkGoldenrod.ToArgb()
        verts(1).X = 1.0F
        verts(1).Y = -1.0F
        verts(1).Z = 0.0F
        verts(1).Color = System.Drawing.Color.MediumOrchid.ToArgb()
        verts(2).X = 0.0F
        verts(2).Y = 1.0F
        verts(2).Z = 0.0F
        verts(2).Color = System.Drawing.Color.Cornsilk.ToArgb()
        vb.Unlock()
    End Sub


    Private Sub Render()
        If device Is Nothing Or pause Then Return

        ' Очистка заднего буфера синим цветом 
        device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)

        device.BeginScene() ' Начало сцены

        SetupMatrices() ' Настройка мировой, видовой и матрицы проекций

        device.SetStreamSource(0, vertexBuffer, 0)
        device.VertexFormat = CustomVertex.PositionColored.Format
        device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)

        device.EndScene() ' Конец сцены
        device.Present() ' Смена буферов
    End Sub


    Private Sub SetupMatrices()
        ' Для нашей мировой матрицы зададим вращение объекта вокруг оси Y.

        ' Пусть наш объект делает один оборот в секунду.
        ' Рассчитаем угол поворота в зависимости от времени (в радианах)
        Dim iTime As Integer = Environment.TickCount Mod 1000
        Dim fAngle As Single = iTime * (2.0F * Math.PI) / 1000.0F
        device.Transform.World = Matrix.RotationY(fAngle)

        ' Настроим видовую матрицу. Для этого необходимо знать 3 параметра: 1) точка
        ' наших глаз в пространстве; 2) направление нашего взгляда; 3) направление, 
        ' которое определяет "верх". Здесь мы устанавливаем, что  точка наших глаз находится
        ' в точке (0, 3, -5) , взгляд направлен в начало координат и определяем "верх" осью Y. 
        device.Transform.View = Matrix.LookAtLH(New Vector3(0.0F, 3.0F, -5.0F), _
                            New Vector3(0.0F, 0.0F, 0.0F), New Vector3(0.0F, 1.0F, 0.0F))

        ' Для матрици проекций мы установим перспективное преобразование, которое
        ' выполнит преобразовани геометрии из 3D пространства в 2D область обзора на экране.
        ' Перспективная проекция делает объеты меньше на большом расстоянии от экрана и наоборот.
        ' Для создания перспективного преобразования мы должны задать поле зрения(обычно 90 градусов),
        ' соотношение размеров нашей 2D области, ближнюю и дальнюю плоскости отсечения (они определяют
        ' расстояние от точки зрения, на котором будет визуализитоваться сцена).
        device.Transform.Projection = Matrix.PerspectiveFovLH(CSng(Math.PI) / 4, _
                                        4.0F / 3.0F, 1.0F, 100.0F)
    End Sub


    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Me.Render() ' Визуализация сцены при событии Paint 
    End Sub

    Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If Asc(e.KeyChar) = CInt(System.Windows.Forms.Keys.Escape) Then
            Me.Close() ' Обработка клавиши Esc
        End If
    End Sub

    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
        pause = (Me.WindowState = FormWindowState.Minimized Or Not Me.Visible)
    End Sub

    '/ <summary>
    '/  Главная точка входа в приложение.
    '/ </summary>
    Shared Sub Main()
        Dim frm As New Matrices 'Создание экземпляга класса нашей формы формы
        If Not frm.InitializeGraphics() Then ' Инициализация Direct3D
            MessageBox.Show("Невозможно инициализировать Direct3D.  Программа будет закрыта.")
            Return
        End If
        frm.Show() 'Отображение нашей формы на экране

        'Главнцй цикл
        While frm.Created
            frm.Render()
            Application.DoEvents()
        End While
    End Sub
End Class
В аттаче скомпилированный проект и исходник этого туториала.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Лit}{Ъ (02.05.2011), Nex (29.05.2009)
Старый 21.03.2006, 18:02   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Туториал №4. Источники света.

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

'-----------------------------------------------------------------------------
' Файл: Lights.vb
'
' Описание: Визуализация 3D геометрии более интересна, когда в сцену добавлены
'    источники света. Для использования освещения в D3D, Вы должны создать один
'    или больше источников света, задать материалы, и убедиться что ваша геометрия 
'    имеет нормали. Источники света могут иметь положение, цвет и бывают следующих типов:
'    направленный (свет исходит из точки, бесконечно удаленной от наблюдателя т.е. просто 
'    имеющий направление света), точечный (свет исходит из точки с координатами x,y,z и 
'    распространяется во всех напавлениях) и "Фонарь".
'    Материалы описывают поверхность геометрии, точнее то как она будет освещаться
'    (цвет рассеяния света, цвет окружающего света и т.д.).
'    Нормали - это составляющие вершин, которые нужны D3D для рассчета освещения поверхности.
'
' Copyright (c) Microsoft Corporation. Все права защищены.
'-----------------------------------------------------------------------------
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Direct3D = Microsoft.DirectX.Direct3D


Public Class Lights
  Inherits Form
  ' Наши глобальные переменные для этого проекта
  Private device As device = Nothing ' Наше устройство рендеринга 
  Private vertexBuffer As vertexBuffer = Nothing 'Буфер вершин
  'Объект, содержащий параметры устройства вывода
  Private presentParams As New PresentParameters
  Private pause As Boolean = False


  Public Sub New()
    ' Устанавливаем начальный размер нашей формы
    Me.ClientSize = New System.Drawing.Size(400, 300)
    ' и её название
    Me.Text = "Direct3D Tutorial 4 - Источники света"
  End Sub


  Public Function InitializeGraphics() As Boolean
    Try
      ' Здесь давайте проинициализируем D3D устройство 
      presentParams.Windowed = True ' Оконный режим
      presentParams.SwapEffect = SwapEffect.Discard ' Сброс кадров
      presentParams.EnableAutoDepthStencil = True ' Включение трафарета глубины
      presentParams.AutoDepthStencilFormat = DepthFormat.D16 ' Фотмат трафарета
      'Создание устройства
      device = New Device(0, DeviceType.Hardware, Me, _
          CreateFlags.SoftwareVertexProcessing, presentParams)
      AddHandler device.DeviceReset, AddressOf Me.OnResetDevice
      Me.OnCreateDevice(device, Nothing)
      Me.OnResetDevice(device, Nothing)
      pause = False
      Return True
    Catch e As DirectXException
      ' При пойманной ошибке возвращаем сообщение о неудачной инициализации устроцства D3D
      Return False
    End Try
  End Function

  Public Sub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs)
    Dim dev As Device = CType(sender, Device)
    ' Созаем буфер вершин
    vertexBuffer = New VertexBuffer(GetType(CustomVertex.PositionNormal), 100, dev, Usage.WriteOnly, CustomVertex.PositionNormal.Format, Pool.Default)
    AddHandler vertexBuffer.Created, AddressOf Me.OnCreateVertexBuffer
    Me.OnCreateVertexBuffer(vertexBuffer, Nothing)
  End Sub

  Public Sub OnResetDevice(ByVal sender As Object, ByVal e As EventArgs)
    Dim dev As Device = CType(sender, Device)
    ' Выключаем отсечение задних поверхностей геометрии
    device.RenderState.CullMode = Cull.None
    ' Включаем Z-буфер (ZBuffer)
    device.RenderState.ZBufferEnable = True
    device.RenderState.Lighting = True 'Включаем освещение
  End Sub

  Public Sub OnCreateVertexBuffer(ByVal sender As Object, ByVal e As EventArgs)
    Dim vb As VertexBuffer = CType(sender, VertexBuffer)
    ' Заполняем буфер вершин (100 вершин)

    ' "задерзиваем" буфер (который возвращает наши структуры)
    Dim verts As CustomVertex.PositionNormal() = CType(vb.Lock(0, 0), CustomVertex.PositionNormal())
    Dim i As Integer
    For i = 0 To 49
      ' Заполняем структуры
      Dim theta As Single = CSng(2 * Math.PI * i) / 49
      verts((2 * i)).SetPosition(New Vector3(CSng(Math.Sin(theta)), -1, CSng(Math.Cos(theta))))
      verts((2 * i)).SetNormal(New Vector3(CSng(Math.Sin(theta)), 0, CSng(Math.Cos(theta))))
      verts((2 * i + 1)).SetPosition(New Vector3(CSng(Math.Sin(theta)), 1, CSng(Math.Cos(theta))))
      verts((2 * i + 1)).SetNormal(New Vector3(CSng(Math.Sin(theta)), 0, CSng(Math.Cos(theta))))
    Next i
    ' "отпускаем" (и копируем) данные
    vb.Unlock()
  End Sub

  Private Sub SetupMatrices()
    ' Для нашей мировой матрицы зададим вращение объекта вокруг оси, которая задается
    ' вектором, на угол зависящий от времени работы программы.

    device.Transform.World = Matrix.RotationAxis(New Vector3(CSng(Math.Cos((Environment.TickCount / 250.0F))), _
              1, CSng(Math.Sin((Environment.TickCount / 250.0F)))), _
              Environment.TickCount / 3000.0F)

    ' Настроим видовую матрицу. Для этого необходимо знать 3 параметра: 1) точка
    ' наших глаз в пространстве; 2) направление нашего взгляда; 3) направление, 
    ' которое определяет "верх". Здесь мы устанавливаем, что точка наших глаз находится
    ' в точке (0, 3, -5) , взгляд направлен в начало координат и определяем "верх" осью Y. 
    device.Transform.View = Matrix.LookAtLH(New Vector3(0.0F, 3.0F, -5.0F), New Vector3(0.0F, 0.0F, 0.0F), New Vector3(0.0F, 1.0F, 0.0F))

    ' Для матрици проекций мы установим перспективное преобразование, которое
    ' выполнит преобразовани геометрии из 3D пространства в 2D область обзора на экране.
    ' Перспективная проекция делает объеты меньше на большом расстоянии от экрана и наоборот.
    ' Для создания перспективного преобразования мы должны задать поле зрения(обычно 90 градусов),
    ' соотношение размеров нашей 2D области, ближнюю и дальнюю плоскости отсечения (они определяют
    ' расстояние от точки зрения, на котором будет визуализитоваться сцена).
    device.Transform.Projection = Matrix.PerspectiveFovLH(CSng(Math.PI) / 4.0F, 1.0F, 1.0F, 100.0F)
  End Sub

  Private Sub SetupLights()
    Dim col As System.Drawing.Color = System.Drawing.Color.BlueViolet
    'Проинициализируем материал. Материал здесь имеет цвет рассеяния и цвет окружающего света
    'установленные фиолетовыми. Обратите внимание, что только один материал используется.
    Dim mtrl As New Direct3D.Material
    mtrl.Diffuse = col
    mtrl.Ambient = col
    device.Material = mtrl

    'Устанавливаем белый направленный источник света и задаем его направление.
    'Обратите внимание, что можно использовать много источников света одновременно (но каждый
    'из них замедляет процесс визуализации сцены). Также,
    'нам необходимо установить состояние (renderstate) D3DRS_LIGHTING для включения освещения

    device.Lights(0).Type = LightType.Directional
    device.Lights(0).Diffuse = System.Drawing.Color.White
    device.Lights(0).Direction = New Vector3(CSng(Math.Cos((Environment.TickCount / 250.0F))), _
                  1.0F, CSng(Math.Sin((Environment.TickCount / 250.0F))))

    device.Lights(0).Commit() 'пусть d3d знает о источнике
    device.Lights(0).Enabled = True 'включаем его
    'Наконец, задаем цвет окружающего света.
    'Окружающий свет - это свет который освещает все объекты в не освещенных местах
    '(другими словами это подсветка).
    device.RenderState.Ambient = System.Drawing.Color.FromArgb(&H202020)
  End Sub


  Private Sub Render()
    If pause Then
      Return
    End If
    ' Очистка заднего буфера синим цветом
    device.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, System.Drawing.Color.Blue, 1.0F, 0)
    'Начало сцены
    device.BeginScene()
    ' Инициализируем освещение и матрицы
    SetupLights()
    SetupMatrices()

    device.SetStreamSource(0, vertexBuffer, 0)
    device.VertexFormat = CustomVertex.PositionNormal.Format
    device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 4 * 25 - 2)
    'Конец сцены
    device.EndScene()
    ' обновление экрана
    device.Present()
  End Sub


  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Me.Render() 'Визуализация сцены при событии Paint 
  End Sub

  Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
    If Asc(e.KeyChar) = CInt(System.Windows.Forms.Keys.Escape) Then
      Me.Close() ' Обработка клавиши Esc 
    End If
  End Sub

  Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
    pause = (Me.WindowState = FormWindowState.Minimized Or Not Me.Visible)
  End Sub

  '/ <summary>
  '/ Главная точка входа в приложение. 
  '/ </summary>
  Shared Sub Main()

    Dim frm As New Lights
    If Not frm.InitializeGraphics() Then ' Инициализация Direct3D
      MessageBox.Show("Невозможно инициализировать Direct3D. Программа будет закрыта.")
      Return
    End If
    frm.Show()

    While frm.Created
      frm.Render()
      Application.DoEvents()
    End While
  End Sub
End Class
В аттаче скомпилированный проект и исходник этого туториала.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Лit}{Ъ (02.05.2011), Nex (29.05.2009)
Старый 02.05.2011, 06:27   #6
Лit}{Ъ
ПроЭктировщик
 
Аватар для Лit}{Ъ
 
Регистрация: 24.10.2009
Сообщений: 143
Написано 5 полезных сообщений
(для 7 пользователей)
Ответ: Туториалы Vb.net & D3d9

Использовал VS 2010 + DxSdk jun08
Первые три примера работают - последний выдаёт 5 ошибок . (заголовок читал, знаю что для старых версий, но всё же)
Можно что то сделать чтобы последний работал?

П.с.
Сори за некрофилию . Графика оченьнама нужна.
__________________
Гомоморфный образ группы - путь во славу коммунизма - изоморфен фактор группе по ядру гомоморфизма.
(Offline)
 
Ответить с цитированием
Старый 02.05.2011, 15:05   #7
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Туториалы Vb.net & D3d9

а какие ошибки то ??

Манаджет ДиректХ уже вроде не поддерживается Майкрософтом и возможно под 2010 студию чет и неработает !!
(Offline)
 
Ответить с цитированием
Старый 02.05.2011, 17:24   #8
Лit}{Ъ
ПроЭктировщик
 
Аватар для Лit}{Ъ
 
Регистрация: 24.10.2009
Сообщений: 143
Написано 5 полезных сообщений
(для 7 пользователей)
Ответ: Туториалы Vb.net & D3d9

'Commit' is not a member of 'Microsoft.DirectX.Direct3D.Light'.
и
'SetNormal' is not a member of 'Microsoft.DirectX.Direct3D.CustomVertex.PositionN ormal'. (этот 4 раза я сначала не обратил внимание на повторение)
__________________
Гомоморфный образ группы - путь во славу коммунизма - изоморфен фактор группе по ядру гомоморфизма.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
D3D9 Genius C++ 0 23.02.2008 13:54
Обучение, туториалы Atomikc Полезные ссылки 8 01.01.2007 23:40
туториалы по Cartography Shop и TotalTerrain ZanoZa Болтовня 0 15.06.2006 10:52
Туториалы для начинающих alcosholik Полезные ссылки 5 26.10.2005 20:59
Туториалы по созданию текстур Matt Merkulov Создание текстур 0 23.10.2005 07:42


Часовой пояс GMT +4, время: 04:59.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com