我正在开发一个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%
答案 0 :(得分:3)
您的帖子来自2017年12月,而您的SDL版本(2.0.7)则来自2018年1月。您的赏金是最新的,但没有新信息。
主要问题是,SDL2.0.7在Windows上不正确支持HighDPI。在2017年5月,他们prepared发行了一个更大的补丁程序,但在2018年2月是merged,因此是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上查询每个Monitor的DPI值,并根据该大小进行计算。
由于您使用的是带有延迟着色的OpenGL:请确保为每个渲染过程正确设置glViewPort
。