Константы цветовых режимов в 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 - это структура, в которую будет записан результат работы функции (то есть после выполнения функции эта структура данных будет содержать информацию о текущем видеорежиме).