这是我用来在 3d 场景中获取鼠标位置的代码:
void GetOGLPos(int x, int y, GLdouble &pX, GLdouble &pY, GLdouble &pZ){
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
winX = (float)x;
winY = (float)viewport[3]-(float)y;
glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &pX, &pY, &pZ);
}
但我注意到一件坏事...每帧对该函数调用 1-2 次会使 CPU 使用率达到 100%,调用 3 次或更多次会使 CPU 使用率达到 200%(我有 4 个内核,调用 1-2 次 = 25%,3或更多调用 = 50%,我认为我不能让它高于 50%..)
有没有其他方法可以有效地做到这一点?我每帧对该函数调用 4 次,因此我知道应该为我的场景渲染哪些区域(我从屏幕的每个角落获取它们)。
我也用它来知道我用鼠标指向哪个地方,所以我需要它实时,但我想使用更少的 CPU,因为即使只有 1 个调用也会使单核系统使用 100%。
编辑
我已经尝试过 glPushName() 方法,但它在我的 GPU 中比在 CPU 中更慢,更可能更慢。此外,当我在我的程序中不使用单个 glReadPixels() 调用时,我的 CPU 使用率仅为 0-1%。奇怪的是我的 CPU 使用率很高,但它并没有像您预期的那样在 100% 使用率时使程序滞后……唯一的问题是当我在我的程序运行时使用其他程序时,然后使用它们会很慢.
最佳答案
您似乎尝试在 OpenGL 中进行拾取。
查看本教程,它应该比您的方法带来更少的性能损失: http://gpwiki.org/index.php/OpenGL:Tutorials:Picking
这个地方提到了在 OpenGL 中进行拾取的其他方法: http://www.opengl.org/resources/faq/technical/selection.htm
关于c++ - glReadPixels() 真的很慢,从鼠标位置获取 OpenGL 坐标的更好解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211303/