double arrow
Константы цветовых режимов в Direct3D

Рис. 2.9. Рисование во вторичном буфере скрывает от вас объекты, пока вы не выполните переключение экранов


В общем виде структура выглядит следующим образом:

typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT FullScreen_PresentationInterval;} D3DPRESENT_PARAMETERS;

· BackBufferWidth и BackBufferHeight – ширина и высота вторичного буфера. Если используется полноэкранный режим, то значения параметров должно быть равно размерам устанавливаемого разрешения. Если используется оконный режим, то значения параметров могут быть нулевыми и в этом случае буфер будет установлен в размеры клиентской части окна, которое будет использоваться для вывода Direct3D графики;


· BackBufferFormat – формат пикселя. Если используется оконный режим, то формат должен соответствовать текущему установленному значению в настройках Windows, потому что в оконном режиме нельзя поменять формат пикселя для отдельного окна. В случае с полноэкранным режимом можно использовать любое из возможных значений:

o D3DFMT_R8G8B8 – 24 бит, по 8 бит на цвет (красный, зеленый и голубой);

o D3DFMT_A8R8G8B8 – 32 бит, по 8 пикселей на канал (красный, зеленый, голубой и альфа);

o D3DFMT_R5G6B5 – 16 бит, 5 бит на красный, 6 на зеленый и 5 на голубой;

o D3DFMT_X1R5G5B5 – 16 бит, по 5 на каждый цвет и один бит зарезервирован;

o D3DFMT_A1R5G5B5 – 16 бит, по 5 на каждый цвет и один бит зарезервирован для альфа канала.




· BackBufferCount – количество используемых вторичных буферов. Здесь можно указать значение от 0 до 3 (обычно задаётся значение 1);

· MultiSampleType – определяет тип переключения буферов. Этот параметр имеет смысл только при использовании эффекта переключения (параметр SwapEffect) D3DSWAPEFFECT_DISCARD.


· SwapEffect – тип переключения буферов. Здесь можно указать одно из следующих значений:

o D3DSWAPEFFECT_DISCARD – после переключения буфера, содержимое вторичного буфера сбрасывается. При использовании других режимов буферы меняются местами без сброса содержимого;

o D3DSWAPEFFECT_FLIP – переключение буфера, при котором вторичный буфер становиться первичным без необходимости копировать данные. Этот метод наиболее быстрый, но может использоваться только при полноэкранном режиме;

o D3DSWAPEFFECT_COPY – копирование вторичного буфера на первичный. Параметр может использоваться при наличии одного вторичного буфера. Во время копирования не происходит синхронизации с вертикальным обновлением экрана VSYNC, поэтому без дополнительных проверок может возникнуть эффект бегущей полосы;



o D3DSWAPEFFECT_COPY_VSYNC – копирование вторичного буфера на первичный с вертикальной синхронизацией;

o D3DSWAPEFFECT_FORCE_DWORD – не используется.

· hDeviceWindow – окно, которое будет использоваться для вывода графики. Если параметр равен нулю, то будет использоваться активное окно. При полноэкранном режиме используется все окно.

· Windowed – если параметр равен TRUE, то будет использоваться оконный режим, иначе, полноэкранный;

· EnableAutoDepthStencil – если параметр равен TRUE, то DirectX будет автоматически управлять буфером глубины;

· AutoDepthStencilFormat – формат буфера глубины. Здесь могут быть такие же значения, как и у параметра BackBufferFormat;

· Flags – дополнительные флаги;


· FullScreen_RefreshRateInHz – частота обновления экрана, используется только в полноэкранном режиме. Параметр должен содержать значение, которое будет поддерживаться данным компьютером. Для оконного приложения в этом параметре должно быть значение или константа D3DPRESENT_RATE_DEFAULT;

· FullScreen_PresentationInterval – интервал представления в полноэкранном режиме. Здесь можно указать одно из следующих значений:

· D3DPRESENT_INTERVAL_IMMEDIATE— Показ выполняется немедленно.

· D3DPRESENT_INTERVAL_DEFAULT— Direct3D сам выбирает частоту показа. Обычно она равна частоте кадров.


Далее заполняем основные свойства, которые будут идентичны для полноэкранного и оконного режимов, а именно – ширина и высота вторичного буфера:

d3dpp.BackBufferWidth = iWidth;d3dpp.BackBufferHeight = iHeight;

Запрашиваем у пользователя с помощью окна MessageBox, необходимо ли отобразить окно в полноэкранном режиме? Если да, то продолжаем заполнять структуру параметрами, которые будут использоваться в полноэкранном режиме:

Установки для полноэкранного режима

d3dpp.BackBufferFormat = D3DFMT_R5G6B5;d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;d3dpp.Windowed = FALSE;d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

В качестве формата пикселя выбран D3DFMT_R5G6B5, при котором 16 бит для хранения цвета делятся в следующем соотношении: красный – 5 бит, зеленый – 6 бит и голубой – 5 бит. Шестнадцать бит позволяют использовать 65535 цветов, а этого достаточно, чтобы создавать реалистичные эффекты, и при этом, производительность будет достаточно высокая.

Для переключения буфера будем использовать метод D3DSWAPEFFECT_FLIP, который является самым быстрым, но может использоваться только в полноэкранном режиме.

Свойство Windowed устанавливаем в FALSE,потому что это полноэкранный режим.

Устанавливаем частоту смены экрана в значение по умолчанию D3DPRESENT_RATE_DEFAULT. Для электронно-лучевых мониторов минимальной частотой, которая не будет создавать мерцания, является 85 герц. У ЖК мониторов 60 герц является максимумом и приемлемым для глаз.


Установки для оконного режима

Определяем текущее положение окна и с помощью функции MoveWindow устанавливаем новые размеры:

RECT wndRect;RECT clientRect;GetWindowRect(hWnd, &wndRect);GetClientRect(hWnd, &clientRect); int iWinWidth = iWidth + (wndRect.right-wndRect.left) - (clientRect.right-clientRect.left);int iWinHeight = iHeight + (wndRect.bottom-wndRect.top) – (clientRect.bottom-clientRect.top); MoveWindow(hWnd, wndRect.left, wndRect.top, iWinWidth, iWinHeight, TRUE);

Для оконного режима нельзя выбрать формат пикселя, который захочется, необходимо использовать тот формат, который сейчас установлен в Windows. Для определения формата, который в данный момент установлен, используется метод GetAdapterDisplayMode интерфейса IDirect3D. Этому методу нужно передать два параметра:

· адаптер, информацию о котором нужно получить. Мы будем использовать первичный адаптер, а для ссылки на него можно использовать константу D3DADAPTER_DEFAULT;

· переменная типа D3DDISPLAYMODE - это структура, в которую будет записан результат работы функции (то есть после выполнения функции эта структура данных будет содержать информацию о текущем видеорежиме).







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