glReadPixels()真的很慢,更好的解决方案从鼠标位置获取OpenGL坐标?

New*_*bie 5 c++ opengl glreadpixels

这是我用来在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);
}
Run Code Online (Sandbox Code Playgroud)

但我注意到一件坏事...每帧1-2次调用该函数会使CPU占用率达到100%,3次或更多次调用200%CPU占用率(我有4个核心,1-2个呼叫= 25%,3个或更多呼叫) = 50%,我认为它不能高于50%...)

有没有其他方法可以有效地做到这一点?我每帧使用4次调用该函数,所以我知道应该为场景渲染哪些区域(我从每个屏幕角落拍摄).

另外我用它来知道我用鼠标指向哪个地方,所以我需要实时,但我想使用更少的CPU,因为即使只有1次调用也会使单核系统的使用率达到100%.

编辑

我已经尝试过glPushName()方法,但它的速度更慢,在我的GPU中比在CPU中更慢.当我在程序中不使用单个glReadPixels()调用时,我的CPU使用率仅为0-1%.奇怪的是,我的CPU使用率很高,但它不会使程序滞后,就像你预期的那样100%使用...当我的程序打开时,只有当我使用其他程序时才出现问题,那么使用它们会有些滞后.

Las*_*lan 1

看来你尝试在 OpenGL 中进行拾取。

查看本教程,它的性能损失应该比您的方法少: http://gpwiki.org/index.php/OpenGL:Tutorials :Picking

这个地方提到了在 OpenGL 中进行拾取的其他方法: http://www.opengl.org/resources/faq/technical/selection.htm