Урок 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 байта) и можно будет приступить ко второму уроку.
Друзья сайта: Фан. сайт игры Prince of Persia Игровая Зона - сайт о компьтерных играх Все о заработке в интернете
Hosted by uCoz