为什么视网膜屏幕坐标值是像素值的两倍

Jac*_*eng 6 opengl resolution retina-display

我的电脑是配备13英寸视网膜屏幕的Mac专业版.屏幕分辨率为1280*800(默认).

使用以下代码:

gWindow = glfwCreateWindow(800, 600, "OpenGL Tutorial", NULL, NULL);

//case 1
glViewport(0,0,1600,1200);
//case 2
glViewport(0,0,800,600);
Run Code Online (Sandbox Code Playgroud)

情况1导致适合窗口的三角形.

情况2导致三角形的大小是窗口大小的1/4.

视口的一半:

在此输入图像描述

GLFW文档显示以下内容(从此处):

虽然窗口的大小是以屏幕坐标测量的,但OpenGL与像素一起使用.例如,传入glViewport的大小应以像素为单位.在某些机器上,屏幕坐标和像素是相同的,但在其他机器上它们不会.还有第二组函数用于检索窗口的帧缓冲区的大小(以像素为单位).

为什么我的视网膜屏幕坐标值是像素值的两倍?

ric*_*ing 7

正如Sabuncu所说,很难知道在不知道如何绘制三角形的情况下哪些结果应该是正确的.

但我想你的问题与视网膜屏幕有关,当你使用2.0比例因子时,你需要渲染两倍的像素,就像你使用普通屏幕一样 - 见这里

您所追求的方法只显示在您的GLFL链接下方几行

还有glfwGetFramebufferSize用于直接检索窗口的帧缓冲区的当前大小.

int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
Run Code Online (Sandbox Code Playgroud)

帧缓冲区的大小可以独立于窗口的大小而改变,例如,如果窗口在常规监视器和高DPI之间拖动.

在你的情况下,我打赌你得到的帧缓冲区大小将是窗口大小的两倍,你的gl视口需要匹配它.

  • @JacksonZheng:这是苹果公司引入的一种黑客手段,使旧版程序可以看到“正常”单位,而其窗口在实际以更高的分辨率渲染时可以“正常”显示。实话实说,这是一个导致各种问题的愚蠢破解。但是人们会抱怨,如果没有它,程序看起来会难以阅读,销量会下降,而且一定不会发生。技术敏感性很少影响最终对收入产生直接影响的决策。 (2认同)