macos - gluUnProject() 在 mac(视网膜显示)上给出不正确的值,但在其他系统上正常工作
问题描述
返回的值gluUnProject()
是预期值的一半。
解决方案
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;
}
推荐阅读
- javascript - 循环仅显示 1 个元素
- html - 有没有办法从后面的代码更改链接的 html 页面?
- python - Mypy 没有捕捉到类型 mysmatch
- c# - 如何按字符为字符对 TreeView 输出的字典进行排序?
- azure - Azure 逻辑应用获取大于 300MB 的文件内容
- android - 获取与活动相关的错误未在片段中运行
- python - 我想将数据框的值替换为python中的列名。我该怎么做?
- ios - AdMob - 在 isReady 属性更改时获取通知
- javascript - 可以从 url 中省略 ID[] 吗?
- c++ - 从两个不同的类继承的非虚拟基类的访问成员