【发布时间】:2017-11-01 06:52:44
【问题描述】:
当应用程序支持 DPI 监视器时,在 OpenGL 应用程序中处理 DPI 缩放的正确方法是什么。又名:
SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
我在不同的设备上发现了不同的行为 - 可能与驱动程序有关,但有些机器需要像这样设置视口:
glViewport(0, 0, prc->right, prc->bottom)
而其他人需要这样的东西:
glViewport(0, 0, (int)(prc->right * 96 / dpi), (int)(prc->bottom * 96 / dpi));
(其中 prc 是客户端矩形,dpi 是窗口的当前 DPI)。
我已经整理了一个 simple demo program 来显示问题。问题发生在更改系统缩放之后,但在注销/重新登录之前。
问题包括:
- 以错误的比例渲染(不确定哪个驱动程序错误)
- 垂直移动取决于更改缩放之前与更改缩放之后标题栏高度的差异。 (在 macbook pro/bootcamp 上)
我尝试在 WM_DPICHANGED 上拆除并重新创建 wgl 上下文,但无济于事,不知道还能尝试什么。
更新:我已经更新了示例程序存储库以包含我所看到的屏幕截图,并且我已经包含了测试程序的 .exe。
请看这里:https://bitbucket.org/toptensoftware/minimalopengl/overview
更新 2 - 找到了一个可以按预期工作的 GPU Radeon RX460。更新了 repo 中的屏幕截图以显示预期内容。
更新 3 - 我现在相当有信心这是由 NVidia 和 Intel 驱动程序的问题引起的,并且已经记录了两者的错误。我猜 WHQL 合规性不包括 OpenGL 驱动程序。
仍然...如果有适当的文档或来自 Microsoft 的示例程序,说明 OpenGL 和每个显示器的 DPI 支持应该如何工作,那就太好了。
【问题讨论】:
-
你从哪里得到
prc->right和prc->bottom? -
如前所述,它是窗口的客户端矩形(即:GetClientRect)。有关详细信息,请参阅参考的演示程序。
标签: opengl windows-10 dpi