![](images/chestnut/misc/left.gif) |
19.03.2006, 15:57
|
#1
|
Unity/C# кодер
Регистрация: 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) с некоторыми изменениями.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
19.03.2006, 16:29
|
#2
|
Unity/C# кодер
Регистрация: 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. Откройте добавленный файл для редактирования и вставьте следующий код:
![](images/chestnut/misc/code_html.gif)
'-----------------------------------------------------------------------------
' Файл: 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). Далее выполняется отображение формы на экране. И наконец, приложение переходит в главный цикл, условием завершения которого является уничтожение нашей формы. Вот и все.
Скомпилированный проект с исходником прикреплен ниже.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
19.03.2006, 22:39
|
#3
|
Unity/C# кодер
Регистрация: 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
а другая будет событием, которое буде выполнться для заполения буфера вершинами и при изменени размера окна (как доконца в этом разберусь, так расскажу почему это нужно).
![](images/chestnut/misc/code_html.gif)
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-мя цветами (голубой, коричневый и розовый).
В аттаче вы найдете готовый проект (скомпилированный файл и исходники).
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
20.03.2006, 17:38
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Туториал №3. Матрицы.
В этом туториале Вы научитесь применять матрицы, необходимые для работы с 3D. Все описания этого туториала находятся в коде в виде коментариев. Сам код будет вам хорошо понятен, если вы читали предидущие два туториала
![](images/chestnut/misc/code_html.gif)
'-----------------------------------------------------------------------------
' Файл: 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
В аттаче скомпилированный проект и исходник этого туториала.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
21.03.2006, 18:02
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Туториал №4. Источники света.
В этом туториале вы узнаете как создавать источники света, настраивать их, и какие они бывают. Как и в предидущем туториале все описание находится в коде.
![](images/chestnut/misc/code_html.gif)
'-----------------------------------------------------------------------------
' Файл: 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
В аттаче скомпилированный проект и исходник этого туториала.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
02.05.2011, 06:27
|
#6
|
ПроЭктировщик
Регистрация: 24.10.2009
Сообщений: 143
Написано 5 полезных сообщений (для 7 пользователей)
|
Ответ: Туториалы Vb.net & D3d9
Использовал VS 2010 + DxSdk jun08
Первые три примера работают - последний выдаёт 5 ошибок ![Mad](images/smilies/mad.gif) . (заголовок читал, знаю что для старых версий, но всё же)
Можно что то сделать чтобы последний работал?
П.с.
Сори за некрофилию ![:)](images/smilies/smile.gif) . Графика оченьнама нужна.
__________________
Гомоморфный образ группы - путь во славу коммунизма - изоморфен фактор группе по ядру гомоморфизма.
|
(Offline)
|
|
02.05.2011, 15:05
|
#7
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: Туториалы Vb.net & D3d9
а какие ошибки то ??
Манаджет ДиректХ уже вроде не поддерживается Майкрософтом и возможно под 2010 студию чет и неработает !!
|
(Offline)
|
|
02.05.2011, 17:24
|
#8
|
ПроЭктировщик
Регистрация: 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 раза ![:-)](images/smilies/grins.gif) я сначала не обратил внимание на повторение)
__________________
Гомоморфный образ группы - путь во славу коммунизма - изоморфен фактор группе по ядру гомоморфизма.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:08.
|