performance - glReadPixels() 读取 GL_DEPTH_COMPONENT 时速度缓慢

标签 performance opengl framebuffer glreadpixels

我的应用程序依赖于从帧缓冲区读取深度信息。我已经用 glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data) 实现了这个

然而,这运行速度慢得不合理,它使我的应用程序从平滑的 30 fps 变为滞后的 3 fps。如果我尝试读回其他维度或数据,它会在可接受的水平上运行。

概述:

  • 无 glReadPixels -> 每秒 30 帧
  • glReadPixels(0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &深度数据); -> 每秒 20 帧,可接受
  • glReadPixels(0, 0, 宽度, 高度, GL_RED, GL_FLOAT, &深度数据); -> 每秒 20 帧,可接受
  • glReadPixels(0, 0, 宽度, 高度, GL_DEPTH_COMPONENT, GL_FLOAT, &深度数据); -> 每秒 3 帧, Not Acceptable

与其他调用相比,为什么最后一个调用如此慢?有什么办法可以补救吗?

宽度 x 高度约为 100 x 1000,随着尺寸的增加,调用速度会越来越慢。

我也尝试过使用像素缓冲区对象,但这对性能没有显着影响,它只会将缓慢的速度延迟到调用 glMapBuffer() 为止。

(我在 MacBook Air nVidia 320m 显卡 OS X 10.6 上对此进行了测试,奇怪的是我的旧 MacBook Intel GMA x3100 读取深度缓冲区的速度约为 15 fps。)

更新:将 GLUT_MULTISAMPLE 排除在 glutInitDisplayMode 选项之外会带来很大的不同,使应用程序再次恢复到平滑的 20fps。我不知道这个选项首先是做什么的,有人能解释一下吗?

最佳答案

如果您的主帧缓冲区启用了 MSAA(存在 GLUT_MULTISAMPLE),则会创建 2 个实际的帧缓冲区 - 一个具有 MSAA,另一个是常规帧缓冲区。

第一个是您需要填写的。它包含正面和背面颜色表面,以及深度和模板。第二个必须仅包含通过解析相应的 MSAA 表面产生的颜色。

但是,当您尝试使用 glReadPixels 读取深度时,驱动程序也被迫解析启用 MSAA 的深度表面,这可能会导致速度变慢。

关于performance - glReadPixels() 读取 GL_DEPTH_COMPONENT 时速度缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5499729/

相关文章:

Perl 字符串的性能

linux - Directfb 未实现错误

c++ - OpenGL:一次只能有一个 FBO 工作

ubuntu - CMake 在 Ubuntu 中找不到 OpenGL

java - 首先 .put() 出现 BufferOverFlowException

macos - SDL2 窗口在调整大小时变黑

opengl - 设置 OpenGL 多个渲染目标

java - java中字符串比较的性能

performance - 导入 R 绘图时 Inkscape 太慢

database - 基于键值的数据库,有人可以向我解释如何实际使用它们吗?