15

我正在开发一个 OpenGL 应用程序。我使用高 dpi 屏幕,Windows GUI 缩放到 125%,以使程序看起来像在常规屏幕上。

如果我使用 SDL2 创建一个 800*600 的窗口,它看起来与常规屏幕中的大小相同,但它是 1000*750 像素。由于我使用延迟渲染,我必须创建与可绘制区域大小相同的缓冲区,所以我想找出窗口的实际大小(以像素为单位)

如果我打电话SDL_GL_GetDrawableSize,我会错误地得到 800*600 而不是 1000*750。我在创建窗口时添加了标志SDL_WINDOW_ALLOW_HIGHDPI

我错了什么?


编辑

如果我将Visual Studio 中的DPI Awareness更改为Per Monitor High DPI Aware,那么窗口实际上是 800*600,但看起来很小。它应该是 1000*750,因为 Windows 设置中的缩放因子是 125%

4

1 回答 1

3

您的帖子来自 2017 年 12 月,您的 SDL 版本 (2.0.7) 评论来自 2018 年 1 月。您的赏金是最新的,但没有更新的信息。

主要问题是,SDL2.0.7 在 Windows 上没有正确支持 HighDPI。2017年5月,他们准备了一个更大的补丁,但是在2018年2月被合并,所以在SDL2.0.7版本之后。据我看,它是在SDL2.0.8中引入的。主要更改是在文件中进行的src/video/windows/SDL_windowswindow.c。我比较了来源和变更日志。它肯定是上游的,但是有人忘记在WhatIsNew.txt中写下来,这很烦人。

我强烈建议将 SDL 升级到至少 2.0.8,更好的是 2.0.10。

顺便提一句。补丁的作者提到,您需要使用新的提示SDL_HINT_VIDEO_HIGHDPI_ENABLED

在最坏的情况下,如果您仍然遇到问题,您可以使用 GLFW 代替 SDL。

编辑: 发问者今天提供了新信息。

您可以通过GetDpiForMonitor在 Windows 上查询每个监视器的 DPI 值并从中计算大小。

由于您使用的是带有延迟着色的 OpenGL:确保您glViewPort为每个渲染通道正确设置。

于 2020-04-19T19:23:33.100 回答