Мне трудно найти хорошие источники информации для объяснения API DirectX, хотя я некоторое время изучал документацию DirectX.
Я пытаюсь создать метод для класса-оболочки для DX9, который меняет разрешение во время выполнения. Мне удалось справиться с этим с помощью DirectDraw, но я не нахожу информации о DX9, хотя она должна быть более распространенной.
Все, что я нашел, было ссылкой на SetDisplayMode, но ни у моего Direct Object, ни у моего DirectX Device такого метода нет.
Я использую DirectX 9.
Пример метода:
void SetResolution(int width, int height, int depth)
{
// I have access to DirectX device, object and the window HWND in this class
};
…изменить размер окна HWND или обработать это в DirectX? Я знаю, как изменить разрешение в приложении Windows, но не знаю, как это сделать в DX9.
Попробуйте настроить параметры D3DPRESENT_PARAMETERS, как обычно. Что-то вроде:
// D3DPRESENT_PARAMETERS is already defined as md3dPP
RECT R ={0, 0, 640, 480}
AdjustwindowRect(&R, WS_OVERLAPPEDWINDOW, false);
md3dPP.BackBufferFormat = D3DFMT_UNKNOWN;
md3dPP.BackBufferWidth = 640;
md3dPP.BackBufferHeight = 480;
md3dPP.Windowed = true;
Если вы хотите, это также может быть хорошим временем для изменения стиля окна, например:
SetWindowLongPtr(yourWindowHandle, GWL_STYLE, WS_OVERLAPPEDWINDOW)
// must use SetWindowPos for SetWindowLongPtr changes to take effect
SetWindowPos(yourWindowHandle, HWND_TOP, 100, 100, R.right, R.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
В качестве альтернативы, если вы используете полноэкранный режим:
md3dPP.BackBufferFormat = D3DFMT_X8R8G8B8;
md3dPP.BackBufferWidth = 640;
md3dPP.BackBufferHeight = 480;
md3dPP.Windowed = true;
SetWindowLongPtr(yourWindowHandle, GWL_STYLE, WS_POPUP)
// must use SetWindowPos for SetWindowLongPtr changes to take effect
SetWindowPos(yourWindowHandle, HWND_TOP, 0, 0, 640, 480, SWP_NOZORDER | SWP_SHOWWINDOW);
В любом случае, выполните это, вызвав IDirect3DDevice9 :: Reset. Просто убедитесь, что вы переинициализировали свои ресурсы при перезагрузке.
Так что если вы определили что-то вроде: IDirect3DDevice9 * gd3dDevice;
Использование:
gd3dDevice->Reset(&md3dPP);
При создании IDirect3DDevice9
решение будет установлено с помощью D3DPRESENT_PARAMETERS
и передний буфер будет выделен. Вы не можете изменить размер буфера без воссоздания всего устройства или вызова IDirect3DDevice9 :: Сброс.