Введение в программирование трехмерных игр с DX9

Приложение D Init


1.5.3. Приложение D3D Init

Как было сказано, рассматриваемый пример приложения создает и инициализирует Direct3D-приложение и очищает экран, заполняя его черным цветом. Обратите внимание, что для упрощения инициализации мы используем наши вспомогательные функции. Полный код проекта можно скачать с веб-сайта этой книги.

ПРИМЕЧАНИЕ

Рассматриваемый пример иллюстрирует те же идеи, что и урок Tutorial 1 из документации DirectX SDK. Завершив чтение этой главы, вы можете прочесть урок Tutorial 1, чтобы познакомиться с другой точкой зрения.

Мы начинаем с включения заголовочного файла d3dUtility.h и объявления глобальной переменной для устройства:

#include "d3dUtility.h" IDirect3DDevice9* Device = 0;

Затем мы реализуем функции, входящие в каркас приложения:

bool Setup() { return true; } void Cleanup() {

}

В данном примере нам не требуются никакие ресурсы, так что методы Setup и Cleanup остаются пустыми.

bool Display(float timeDelta) { if(Device) { Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); Device->Present(0, 0, 0, 0); // показ вторичного буфера } return true; }

Метод Display вызывает метод IDirect3DDevice9::Clear, который очищает вторичный буфер и буфер глубины/трафарета, заполняя их черным цветом и константой 1.0 соответственно. Обратите внимание, что если приложение не остановлено, мы выполняем только код рисования. Объявление функции IDirect3DDevice9::Clear выглядит так:

HRESULT IDirect3DDevice9::Clear( DWORD Count, const D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil );

Count — Количество прямоугольников в массиве pRects.

pRects — Массив очищаемых прямоугольных областей экрана. Он позволяет очищать отдельные фрагменты поверхности.

Flags — Указывает, какую поверхность очищать. Можно указывать одну или несколько из следующих поверхностей:

  • D3DCLEAR_TARGET — Целевая поверхность визуализации, обычно это вторичный буфер.
  • D3DCLEAR_ZBUFFER — Буфер глубины.


  • D3DCLEAR_STENCIL — Буфер трафарета.




  • Color — Цвет, которым будет заполнена поверхность визуализации.

    Z — Значение, которым будет заполнен буфер глубины (z-буфер).

    Stencil — Значение, которым будет заполнен буфер трафарета.

    После того, как поверхность очищена, мы показываем вторичный буфер, вызвав метод IDirect3DDevice9::Present.

    Оконная процедура обрабатывает пару событий, а именно позволяет выходить из приложения, нажав клавишу Esc.

    LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_DESTROY: ::PostQuitMessage(0); break;

    case WM_KEYDOWN: if( wParam == VK_ESCAPE ) ::DestroyWindow(hwnd); break; } return ::DefWindowProc(hwnd, msg, wParam, lParam); }

    Функция WinMain выполняет следующие действия:

  • Инициализирует главное окно и Direct3D.


  • Вызывает процедуру Setup для инициализации приложения.


  • Запускает цикл обработки сообщений, указав в качестве функции визуализации функцию Display.


  • Освобождает выделенные приложению ресурсы и объект IDirect3DDevice9.


  • int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE prevInstance, LPSTR cmdLine, int showCmd) { if(!d3d::InitD3D(hinstance, 800, 600, true, D3DDEVTYPE_HAL, &Device)) { ::MessageBox(0, "InitD3D() - FAILED", 0, 0); return 0; }

    if(!Setup()) { ::MessageBox(0, "Setup() - FAILED", 0, 0); return 0; }

    d3d::EnterMsgLoop( Display );

    Cleanup();

    Device->Release();

    return 0; }

    Как видите, благодаря вспомогательным функциям выполняющим обработку сообщений и инициализацию Direct3D, структура шаблона приложения получилась исключительно прозрачной.

    Для большинства примеров из этой книги наша задача будет заключаться в написании реализаций функций Setup, Cleanup и Display.

    ПРИМЕЧАНИЕ

    Помните, что для построения данного приложения компоновщику необходимы библиотеки d3d9.lib, d3dx9.lib и winmm.lib.
    Содержание раздела