Читать «DirectX 8. Начинаем работу с DirectX Graphics» онлайн - страница 4

Сергей Ваткин

p_p.Windowed=TRUE;

p_p.SwapEffect=D3DSWAPEFFECT_DISCARD;

Последний шаг, который осуществляет наша функция Init() — создание устройства. Для этого воспользуемся методом IDirect3D8::CreateDevice().

Укажем следующие параметры:

a. D3DADAPTER_DEFAULT — используется стандартный видеоадаптер

b. D3DDEVTYPE_REF — визуализация будет происходить исключительно программными средствами Direct3D

c. hWnd — собственно, идентификатор окна

d. D3DCREATE_SOFTWARE_VERTEXPROCESSING — обработка точек будет происходить исключительно программными средствами

e. &p_p — указатель на структуру, описывающую параметры создающегося устройства

f. &g_pd3dDevice — адрес указателя на интерфейс IDirect3DDevice8, который будет создан

Вот, что должно получиться:

g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &p_p,&g_pd3dDevice);

Функция Render()

Эта функция как раз рендерит сцену. Принцип ее действия:

a. Очищается бэк-буфер, и в него рендерится сцена (итого, в бэк-буфере окажется темно-синий экран, т.к. сцена не содержит объектов)

b. Происходит передача данных во франт-буфер

c. Содержимое франт-буфера "выбрасывается" на экран

Очистить сцену можно вызвав метод IDirect3DDevice8::Clear(). Его первые два параметра мы обнуляем, т.к. хотим очистить экран (на самом деле не экран, а рабочую область окна, но так проще писать :) ) целиком. Значение третьего параметра (D3DCLEAR_TARGET) говорит о том, что очистка должна происходить цветом, заданным четвертым параметром (в нашем случае D3DCOLOR_XRGB(30, 60, 120)). Последние два параметра в нашем случае игнорируются. Поэтому, пишем:

g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(30, 60, 120), 1.0f, 0);

Подготовка завершена, переходим к рендерингу в бэк-буфер:

g_pd3dDevice->BeginScene();

g_pd3dDevice->EndScene();

Методы IDirect3DDevice8::BeginScene() и IDirect3DDevice8::EndScene() показывают, в каком месте начинается, а в каком заканчивается процесс рендеринга. Все методы рендеринга, вызванные вне зоны ограниченной данными операторами, игнорируются.

Последний шаг - передача видеоданных на экран через франт-буфер. Это осуществляется с помощью метода IDirect3DDevice8::Present().

g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

Первые два параметра задают прямоугольные области источника (бэк-буфера) и места назначения (франт-буфера), поскольку копируется целиком вся область, то эти параметры выставлены в ноль. Третий параметр - указатель на принимающее окно, в клиентскую часть которого происходит выполнение метода Present(). Поскольку мы используем структуру D3DPRESENT_PARAMETERS, то третий параметр выставляем в NULL. Четвертый параметр — никогда не используется, его всегда нужно выставлять в NULL :-)

Функция Sweep()

Самая короткая по программному коду функция. Осуществляет "подчистку" после нашей работы.

g_pd3dDevice->Release();

g_pD3D->Release();

UnregisterClass("InitClass", wclass.hInstance);

Все просто. Сначала освобождаем устройства рендеринга, затем объект D3D. После этого остается лишь удалить класс окна и все!