0

尽管我已经查看了一段时间的 DirectX 文档,但我发现很难找到解释 DirectX API 的良好信息来源。

我正在尝试为 DX9 的包装类创建一个方法,该方法会在运行时更改分辨率。我已经设法用 DirectDraw 处理了这个问题,但我没有找到有关 DX9 的信息,即使它应该更常见。

我发现的只是对 SetDisplayMode 的引用,但我的 Direct Object 或我的 DirectX 设备都没有这个方法。

我正在使用 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 中进行。

4

2 回答 2

5

尝试按照通常的方式调整 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);
于 2013-01-11T14:41:52.013 回答
1

创建时IDirect3DDevice9,将使用 设置分辨率,D3DPRESENT_PARAMETERS并分配前端缓冲区。如果不重新创建整个设备或调用IDirect3DDevice9::Reset,则无法更改缓冲区的大小。

于 2013-01-11T13:03:45.627 回答