opengl - 除了使用 glReadPixels 之外,还有其他方法可以在 OpenGL 中读取像素值吗?

标签 opengl

我正在使用 glReadPixel 作为 OpenGL 窗口(宽度*高度)。 要应用我的算法,我必须读取深度缓冲区 2 次和颜色缓冲区(帧)一次。然而

glReadPixels(j ,i ,1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &value);

使用起来太慢。 有什么办法可以加快速度吗?

最佳答案

glReadPixels(j ,i ,1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &value);

“i”和“j”是循环变量的典型名称。除了您提到 1-2 秒是您的用例可接受的延迟这一事实之外,我还得出一个结论:您正在循环中一次读取多个像素。例如您正在调用 glReadPixels 1280*720=921600 次。如果这是不正确的,我们深表歉意。

通常,glReadPixels 被认为很慢,因为 CPU 被迫停止,直到 GPU 完成渲染。在这种情况下,glReadPixels 可能会停滞很多毫秒并严重影响实时帧速率,但我预计延迟最多不会超过 50-100 毫秒(通常要少得多)。

就您而言,我认为它很慢,因为 glReadPixels 的每次调用开销很大。如果您需要读取一大堆像素,请分配更大的内存块,并使用宽度和高度参数通过一次调用 glReadPixels 来读取它们。速度将会快几个数量级。

关于opengl - 除了使用 glReadPixels 之外,还有其他方法可以在 OpenGL 中读取像素值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41757142/

相关文章:

c++ - std::string 的声明导致 OpenGL 出现段错误

java - 将 block 添加到 block - Java OpenGL

矩阵变换的Opengl顺序

opengl - 为什么应该使用外部 OpenGL 加载器函数而不是 GLAD 的内置加载器?

c++ - 在GLSL着色器中采样类型GL_UNSIGNED_SHORT的GL_DEPTH_COMPONENTs

c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题

c++ - OpenGL DevIL c++ 源代码

python - glDrawElements 方法不使用索引和顶点进行绘制

c++ - OpenGL 和单色纹理

c++ - 使用 QOpenGLTexture 和 QOpenGLFrameBufferObject 的多重纹理