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

标签 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);
}

但我注意到一件坏事...每帧对该函数调用 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/

相关文章:

c++ - "int* p=+s;"有什么作用?

c++ - 为通用引用和指向成员的指针推导出冲突类型

c++ - 原子加载和存储,内存顺序放宽

c++ - 从深度重建位置会导致照明不正确

java - 在OpenGL中绘制两个相交的三角形

c++ - 友元类可以在 C++ 中从其友元类创建对象吗?

c++ - 未定义的 vtable 引用,Linux 中的 Qt

ios - 使用 glReadPixels 读取纹理字节?

c++ - 获取当前像素后面的像素

android - 如何在 android 中使用 glreadpixels ——通常会得到零