在 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 中更改分辨率的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中根据屏幕分辨率更改 View 的高度

如何根据设备的分辨率更改样式?

Linux系统怎么更改屏幕分辨率

国产系统——银河麒麟 在VMware虚拟机中如何更改窗口分辨率(大小)?

如何更改 pyqtgraph 中图形的“分辨率”?

delphi 动态更改屏幕分辨率(转)