glReadPixels()在读取GL_DEPTH_COMPONENT时变慢

时间:2011-03-31 12:19:01

标签: performance opengl framebuffer glreadpixels

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

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

概述:

  • 没有glReadPixels - >每秒30帧
  • glReadPixels(0,0,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,& depth_data); - >每秒20帧,可接受
  • glReadPixels(0,0,width,height,GL_RED,GL_FLOAT,& depth_data); - >每秒20帧,可接受
  • glReadPixels(0,0,width,height,GL_DEPTH_COMPONENT,GL_FLOAT,& depth_data); - >每秒3帧,不可接受

为什么最后一个与其他通话相比应该如此之慢?有什么办法可以补救吗?

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

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

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

UPDATE:将GLUT_MULTISAMPLE从glutInitDisplayMode选项中删除,这使得应用程序再次恢复平稳的20fps。我不知道该选项首先是什么,有人可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

您为深度缓冲区选择的存储格式是什么?

如果它不是GLfloat,那么你要求GL在读取它时将深度缓冲区中的每个深度转换为浮动。 (对于你的第3个子弹,GL_RED。你的Color缓冲区是浮动缓冲区吗?)

答案 2 :(得分:0)

无论是GL_FLOAT还是GL_UNSIGNED_BYTE,glReadPixels仍然非常慢。如果您使用PBO获取RGB值,它将非常快。 使用PBO处理RGB值时,CPU使用率为4%。但处理深度值时会增加到50%。我试过GL_FLOAT,GL_UNSIGNED_BYTE,GL_UNSIGNED_INT,GL_UNSIGNED_INT_24_8。因此,我可以得出结论,PBO对读取深度值无用