Надеюсь объяснять, что такое DirectX, не надо. Начнём изучение его версии 8.1 с одного из главных компонентов DirectX - DirectX Graphics, который объеденил в себе двухмерную и трёхмерную графику, т. е. Direct3d и ... нет, DirectDraw прекратил своё существование после появления восьмой версии DirectX, так что двухмерную графику также придётся выводить через Direct3d. Прежде всего, советую скачать DirectX SDK с сайта Microsoft. Если Вы хорошо знаете английский язык, то можете читать подробную справочную информацию о DirectX, а если даже и не знаете, там есть много примеров программ на Visual Basic. Однако, чтобы программировать на Visual Basic, используя DirectX, достаточно лишь подключить к проекту библиотеку DirectX 8 for Visual Basic Type Library. Сделать это можно в окне, открывающегося после щелчка мышью сначала в главном меню VB6 "Проект", затем "Ссылки...". В этом окне необходимо поставить галочку напротив вышеназванной библиотеки. Теперь можно начинать программировать.
В любой программе, использующей Direct3d необходимо сначала создать объект Direct3d и устройство, выполняющее рендеринг, чем мы сейчас и займёмся. Что касается рендеринга, то пока мы будем рендерить лишь пустой синий экран.
Создайте VB6 проэкт, оставьте свойства формы по умолчанию и добавьте на форму таймер. Свойство Interval таймера установите в 40, а Enabled - в False. В процедуру загрузки формы добавьте следующий код:
Private Sub Form_Load()
Me.Show 'при загрузке форма выводится на экран
If Not InitD3d(Form1.hWnd) Then
MsgBox "Невозможно инициализировать Direct3d."
End
End If
Timer1.Enabled = True
End Sub
Происходит следующее: форма появляется на экране, затем вызывается функция InitD3d, которой передаётся параметр Form1.hWnd, функция инициализирует Direct3d, после чего запускается Timer1.
В модуле кода формы сделаем несколько объявлений:
Dim g_DX As New DirectX8 'объект DirectX
Dim g_D3D As Direct3D8 'объект Direct3d
Dim g_D3DDevice As Direct3DDevice8 'устройство Direct3d
Создадим функцию InitD3d:
Function InitD3d(hWnd As Long) As Boolean
On Local Error Resume Next 'чтобы при ошибке программа продолжала работать дальше
Set g_D3D = g_DX.Direct3DCreate() 'получаем объект Direct3d
If g_D3D Is Nothing Then Exit Function 'если ничего не происходит - выход из функции
Dim Mode As D3DDISPLAYMODE
g_D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Mode
Dim d3dpp As D3DPRESENT_PARAMETERS
d3dpp.Windowed = 1
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
d3dpp.BackBufferFormat = Mode.Format
'создаём устройство рендеринга
Set g_D3DDevice = g_D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
If g_D3DDevice Is Nothing Then Exit Function
InitD3d = True 'инициализация Direct3d прошла успешно
End Function
Подробнее о структуре Mode. Она содержит в себе следующие члены: Width, Height, RefreshRate и Format - это соответственно ширина, высота, частота обновления (если она равна нулю, то частота обновления равна частоте обновления по умолчанию данного адаптера) и формат поверхности экрана (представляет из себя набор флагов). В данном примере Mode.Format используется для задания формата заднего буффера.
Первый параметр метода CreateDevice объекта Direct3d задаёт использование главного видеоадаптера, второй параметр - использование аппаратного ускорения видеокарты (для программной эмуляции воспользуйтесь костантой D3DDEVTYPE_REF), в тертьем содержится hWnd формы или элемента управления, который будет использоваться для вывода на экран результатов рендеринга (мы вызвали InitD3d с параметром Form1.hWnd, а можно было создать на форме Picture и вызвать InitD3d с параметром Picture1.hWnd, чтобы изображение выводилось в Picture1), четвёртый параметр представляет из себя список флагов (флаг, ипользованный в данном случае означает программную обработку вершин), и, наконец, в последнем параметре содержатся всевозможные свойства создаваемого устройства.
Теперь создадим процедуру, которая будет производить рендеринг синего экрана:
Public Sub Render()
g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &HFF&, 1#, 0
' Начало сцены
g_D3DDevice.BeginScene
' Рендеринг объектов сцены происходит здесь
' Конец сцены
g_D3DDevice.EndScene
g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub
Первые два параметра метода Clear - это размер и адресс массива прямоугольников, которые будут очищены (чтобы очистить всё используем 0 и ByVal 0), третий параметр описывает поведение метода, т. е. буфера, которые следует очищать (может быть любой комбинацией трёх флагов: D3DCLEAR_TARGET, D3DCLEAR_ZBUFFER, D3DCLEAR_STENCIL); D3DCLEAR_TARGET значит, что происходит только очитска поверхности, на которую производится рендеринг, четвёртый параметр - цвет, которым заполняется эта поверхность (в данном случае он синий); последние же два параметра используются для заполнения остальных буферов.
Затем идут методы BeginScene и EndScene. Только между ними должны располагаться все команды рендеринга объектов сцены.
Чтобы показать всем отрендеренную сцену используется метод Present. Как правило все параметры этого метода устанавливаются в нули, как и происходит в данном примере.
Напишем ещё несколько строк кода - и программа готова.
Private Sub Form_Unload(Cancel As Integer)
CleanUp 'при выгрузке формы запукаем процедуру сборки мусора
End Sub
Private Sub Timer1_Timer()
Render 'рендеринг происходит каждый раз, когда срабатывает таймер
End Sub
Public Sub CleanUp()
Set g_D3DDevice = Nothing
Set g_D3D = Nothing
End Sub
Хотелось бы обратить Ваше внимание на процедуру CleanUp. Аналогичная процедура, уничтожающая созданные объекты, должна присутствовать в каждой программе во избежание всевозможных ошибок и глюков.
Теперь можете запускать программу на выполнение, если всё сделали правильно, увидите форму, раскрашенную в синий цвет.
Вы можете скачать архив RAR с готовым проектом (2 Кб).
В следующей части мы займёмся рендерингом двухмерного треугольника.
Следующая часть>>