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

Opengl 为什么视网膜屏幕坐标值是像素值的两倍,opengl,resolution,retina-display,Opengl,Resolution,Retina Display,我的电脑是Mac pro,有13英寸的视网膜屏幕。屏幕分辨率为1280*800(默认) 使用以下代码: gWindow = glfwCreateWindow(800, 600, "OpenGL Tutorial", NULL, NULL); //case 1 glViewport(0,0,1600,1200); //case 2 glViewport(0,0,800,600); 案例1生成一个适合窗口的三角形 案例2生成的三角形是窗口大小的1/4 视口的一半: GLFW文件说明了以下内容(

我的电脑是Mac pro,有13英寸的视网膜屏幕。屏幕分辨率为1280*800(默认)

使用以下代码:

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

//case 1
glViewport(0,0,1600,1200);
//case 2
glViewport(0,0,800,600);
案例1生成一个适合窗口的三角形

案例2生成的三角形是窗口大小的1/4

视口的一半:

GLFW文件说明了以下内容(来源):

窗口的大小是用屏幕坐标测量的,而OpenGL 使用像素。例如,传递到视口的大小, 应以像素为单位。在某些机器上,屏幕坐标和像素 都是一样的,但在其他人身上就不同了。还有第二套 函数用于检索文件的帧缓冲区大小(以像素为单位) 窗户


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

帧缓冲区大小永远不需要等于窗口大小,因为您需要使用:

此函数用于检索指定窗口的帧缓冲区的大小(以像素为单位)。如果要检索屏幕坐标中的窗口大小,请参阅GLFWGetWindowsSize

无论何时调整窗口大小,都需要检索其框架的大小并根据其更新视口:

 glfwGetFramebufferSize(gWindow, &framebufferWidth, &framebufferHeight);

 glViewport(0, 0, framebufferWidth, framebufferHeight);
如前所述,如果不知道如何绘制三角形,就很难知道什么结果应该是正确的

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

在GLFL链接下方的几行中显示了您要使用的方法

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

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


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

对于视网膜显示,默认帧缓冲区(渲染到画布上的帧缓冲区)是显示分辨率的两倍。因此,如果显示为800x600,则内部画布为1600x1200,因此您的视口应为1600x1200,因为这是“窗口”进入帧缓冲区。

发布绘制三角形的代码。我真的想知道为什么视网膜屏幕坐标值是像素值的两倍?@JacksonZheng:这是苹果引入的一种黑客技术,让传统程序可以看到“正常”单位,让它们的窗口在以更高分辨率渲染时显示“正常”。说实话,这是一个愚蠢的黑客导致了各种各样的问题。但人们会抱怨,如果没有它,节目看起来太小,看不懂,销量就会下降,而这种情况决不能发生。技术敏感性很少影响最终直接影响收入的决策。
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);