double arrow

DWORD Stencil

Float Z,

D3DCOLOR Color,

DWORD Flags,

DWORD Count,

HRESULT Clear(

Закрасим экран и отобразим сцену на экране.

Лекция №7. Отображение в Direct3D

Освобождение выделенных ресурсов

Для освобождения интерфейсов Direct3D используется метод Release. Сначала необходимо вызвать этот метод, а потом обнулить переменную. Освобождение ресурсов должно идти в обратном созданию порядке. В нашем приложении сначала был создан интерфейс IDirect3D9, а затем IDirect3DDevice9. Это значит, что сначала нужно уничтожить IDirect3DDevice9, а потом уже IDirect3D9.

Следующий код показывает, как можно освободить интерфейсы, запрошенные в нашем примере:

pD3DDevice->Release();pD3DDevice= NULL;pD3D->Release();pD3D = NULL;

Но вызывать сразу метод Release опасно, ведь если интерфейс не был создан (возникла ошибка во время инициализации или просто интерфейс не был востребован), то произойдет ошибка.

Перед вызовом Release необходимо проверить существование интерфейса:

if (pD3DDevice) { pD3DDevice->Release(); pD3DDevice= NULL; }if (pD3D) { pD3D->Release(); pD3D = NULL; }

Для избежания ошибок, лучше во время объявления переменных интерфейсов DirectX сразу указывать, что они изначально равны нулю:

IDirect3D9 *pD3D = NULL;IDirect3DDevice9 *pD3DDevice = NULL;

Проект инициализации, который мы рассмотрели ранее, ничего не делал. Единственное, что мы могли увидеть — белый экран.

Создание сцены происходит во вторичном буфере и только потом происходит переключение на первичный буфер. Единственное различие — в Direct3D можно не заботиться, в каком именно буфере происходит рисование.

Основной интерфейс Direct3D— это IDirect3DDevice9. Он имеет необходимые для отображения методы. Так, например, для очистки используется метод Clear, который выглядит следующим образом:

const D3DRECT *pRects,

);

– Count — количество прямоугольников. Метод может закрашивать сразу несколько прямоугольников, указатель на которые должен быть во втором параметре;

– pRects — указатель на структуру, которая будет определять закрашиваемый прямоугольник. Если параметр равен нулю, то закрашивается вся область.

Структура D3DRECT имееет вид:

typedef struct _D3DRECT{

LONG x1,y1;

LONG x2,y2;

} D3DRECT;


– Flags — параметры закраски. Здесь можно указать одно из следующих значений:

D3DCLEAR_TARGET— очистить отображение. Значение цвета указано в параметре Color;

D3DCLEAR_STENCIL— очистить stencil-буфер (буфер трафарета). Значение, которым будет заполнен буфер, указано в параметре stencil;

D3DCLEAR_ZBUFFER— очистить буфер глубины. Значение очистки находится в параметре z;

– Color — цвет, которым нужно заполнить буфер отображения;

– z — новое значение, которое будет помещено в буфер глубины. Значение параметра может быть от 0.0 (ближайшее расстояние) до 1.0 (дальнее расстояние);

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

Пример очистки экрана синим цветом:

rect r;

SetRect(&r, 0, 0, iWidth, iHeight);

pD3DDevice->Clear(1, (D3DRECT*)&r, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0, 0);

Для определения цвета используется макрос D3DCOLOR_XRGB, которому необходимо передать три составляющих цвета, а на выходе получаем цвет в формате D3DCOLOR.


В Direct3D есть еще несколько макросов, упрощающих создание цвета в нужном формате:

D3DCOLOR_RGBA — создание цвета в формате красный, зеленый, синий и альфа. Все эти четыре составляющие должны передаваться в качестве параметров в такой же последовательности;

D3DCOLOR_ARGB — создание цвета в формате альфа, красный, зеленый и синий.

Макрос D3DCOLOR_ARGB имеет следующий вид:

#define D3DCOLOR_ARGB(а, r, g, b) \

((D3DCOLOR) ((((а) &0х00)<<24) | (((r) &0х00)<<16) |

(((g) &0х00) <<8) | ((b) &0х00)))

Тип D3DCOLOR является числом – размером в два слова (DWORD). В этом числе в первый байт заносится значение альфа, во второй – значение красного цвета и т. д. Получается, что макрос просто формирует цвет в 32-битном или 4-байтном виде и возвращает его.


Чтобы созданная сцена (в данном случае закраска) отобразилась, необходимо вызвать метод Present, который выглядит следующим образом:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: