在 DirectX9 中更改分辨率
Posted
技术标签:
【中文标题】在 DirectX9 中更改分辨率【英文标题】:Changing resolution in DirectX9 【发布时间】:2013-01-11 12:46:37 【问题描述】:我发现很难找到解释 DirectX API 的良好信息来源,尽管我已经查看了一段时间的 DirectX 文档。
我正在尝试为 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 中进行。
【问题讨论】:
How to resize DirectX window efficiently?的可能重复 【参考方案1】:尝试按照您通常的方式调整您的 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);
【讨论】:
我有一个完全一样的东西,但是每次调用 Reset 都会失败并且屏幕变黑 - 我每次都必须创建一个新设备。【参考方案2】:创建IDirect3DDevice9
时,将使用D3DPRESENT_PARAMETERS
设置分辨率,并分配前端缓冲区。如果不重新创建整个设备或调用 IDirect3DDevice9::Reset,则无法更改缓冲区的大小。
【讨论】:
设置新的 D3DPRESENT_PARAMETER 并在设备上调用 Reset() 后得到的只是白屏,即使每次绘制时我都将背景颜色清除为蓝色。 我还设置了一个热键来启用/禁用全屏,但几次后它就停止响应了。以上是关于在 DirectX9 中更改分辨率的主要内容,如果未能解决你的问题,请参考以下文章