首页 > 解决方案 > gluUnProject() 在 mac(视网膜显示)上给出不正确的值,但在其他系统上正常工作

问题描述

返回的值gluUnProject()是预期值的一半。

标签: macosopengl

解决方案


Retina 显示器具有 DPI 缩放功能,因此帧缓冲区大小和屏幕大小不匹配。

修复只是将屏幕坐标与 devicePixelRatio 相乘,可以如下计算

const GLint WIDTH = 800, HEIGHT = 800;
glfwCreateWindow(WIDTH, HEIGHT, "Test Window", NULL, NULL);
int bufferWidth, bufferHeight;
glfwGetFramebufferSize(mainWindow, &bufferWidth, &bufferHeight);

devicePixelRatio = bufferWidth / WIDTH;

然后,您可以使用以下代码片段计算世界坐标。

void cursor_position_callback(GLFWwindow *window, double xpos, double ypos) {

  xpos *= devicePixelRatio;
  ypos *= devicePixelRatio;

  GLint viewport[4];
  GLdouble modelview[16];
  GLdouble projection[16];
  GLfloat winX, winY, winZ = 0;
  GLdouble posX, posY, posZ;

  glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
  glGetDoublev(GL_PROJECTION_MATRIX, projection);
  glGetIntegerv(GL_VIEWPORT, viewport);

  winX = (float)xpos;
  winY = (float)viewport[3] - (float)ypos;
  glReadPixels(xpos, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

  gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY,
               &posZ);

  cout<<posx<<posy<<posz<<endl;
}

推荐阅读