Урок 1 - "Синий экран жизни"
На этом уроке мы научимся создавать устройство и с его помощью перекрашивать экран в синий цвет. В любой программе, использующей Direct3D необходимо сначала создать объект Direct3D и устройство Device, выполняющее рендеринг(рисование), чем мы сейчас и займёмся. Но для начала добавим в процедуру загрузки следующий код:
Dim rend As Boolean
Private Sub Form_Load()
Me.Show 'при загрузке форма выводится на экран
If Not InitD3d(Form1.hWnd) Then
MsgBox "Невозможно инициализировать Direct3D."
End
End If
rend = True
Render
End Sub
Для начала объявим переменную rend, в которой будет храниться состояние рендеринга.
Что же происходит в процедуре Form_Load. Первым делом форма выводится на экран. Затем вызывается функция InitD3D, в которой происходит создание устройства. Далее управление передается процедуре Render, в которой будет происходить рисование.
Теперь создадим новый модуль и назовем его Direct3D. Для этого в окне «Проводник проектов» вызовем контекстное меню «Добавить-Модуль».
Далее в этом модуле сделаем следующие объявления
Public g_DX As New DirectX8 'объект DirectX
Public g_D3D As Direct3D8 'объект Direct3D
Public g_Device 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_Device = g_D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DPP)
If g_Device Is Nothing Then Exit Function
InitD3d = True 'инициализация Direct3d прошла успешно
End Function
Подробнее о структуре D3DDISPLAYMODE. Она содержит в себе следующие члены: Width, Height, RefreshRate и Format - это соответственно ширина, высота, частота обновления (если она равна нулю, то частота обновления равна частоте обновления по умолчанию данного адаптера) и формат поверхности экрана (представляет из себя набор флагов). В данном примере Mode.Format используется для задания формата заднего буффера.
Первый параметр метода CreateDevice объекта Direct3D задаёт использование главного видеоадаптера, второй параметр - использование аппаратного ускорения видеокарты (для программной эмуляции воспользуйтесь костантой D3DDEVTYPE_REF), в тертьем содержится hWnd формы или элемента управления, который будет использоваться для вывода на экран результатов рендеринга (мы вызвали InitD3d с параметром Form1.hWnd, а можно было создать на форме Picture и вызвать InitD3d с параметром Picture1.hWnd, чтобы изображение выводилось в Picture1), четвёртый параметр представляет из себя список флагов (флаг, ипользованный в данном случае означает программную обработку вершин), и, наконец, в последнем параметре содержатся всевозможные свойства создаваемого устройства.
Теперь в модуле формы создадим процедуру Render, которая будет производить рендеринг синего экрана:
Private Sub Render()
Do While rend
g_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, &HFF&, 1#, 0
'Начало сцены
g_Device.BeginScene
'Рендеринг объектов сцены происходит здесь
'Конец сцены
g_Device.EndScene
g_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
DoEvents 'проверяем наличие действия пользователя
Loop
End Sub
Процедура рендеринга будет повторятся пока переменная rend=True.
Первые два параметра метода Clear - это размер и адресс массива прямоугольников, которые будут очищены (чтобы очистить всё используем 0 и ByVal 0), третий параметр описывает поведение метода, т. е. буфера, которые следует очищать (может быть любой комбинацией трёх флагов: D3DCLEAR_TARGET, D3DCLEAR_ZBUFFER, D3DCLEAR_STENCIL); D3DCLEAR_TARGET значит, что происходит только очитска поверхности, на которую производится рендеринг, четвёртый параметр - цвет, которым заполняется эта поверхность (в данном случае он синий); последние же два параметра используются для заполнения остальных буферов.
Затем идут методы BeginScene и EndScene. Только между ними должны располагаться все команды рендеринга объектов сцены.
Чтобы показать всем отрендеренную сцену используется метод Present. Как правило все параметры этого метода устанавливаются в нули, как и происходит в данном примере.
Теперь сделаем еще несколько штрихов и прграмма готова.
Сначала изменим свойство формы Caption на «Урок 1 - Создание устройства»
Затем в модуле формы напишем следующие строки – и программа готова:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
rend = False
CleanUp 'при выгрузке формы запукаем процедуру сборки мусора
End Sub
Public Sub CleanUp()
Set g_Device = Nothing
Set g_D3D = Nothing
End Sub
Хотелось бы обратить Ваше внимание на процедуру CleanUp. Аналогичная процедура, уничтожающая созданные объекты, должна присутствовать в каждой программе во избежание всевозможных ошибок и глюков.
Теперь можете запускать программу на выполнение, если всё сделали правильно, увидите форму, раскрашенную в синий цвет.
Пример программы можно скачать
здесь (5 644 байта) и можно будет приступить ко
второму уроку.