我的应用程序依赖于从帧缓冲区读取深度信息。我用glReadPixels(0,0,宽度,高度,GL_DEPTH_COMPONENT,GL_FLOAT和& depth_data)实现了这个
然而这种运行速度不合理,它使我的应用程序从平滑的30fps变为滞后的3fps。如果我尝试回读其他维度或数据,它会在可接受的水平上运行。
概述:
为什么最后一个与其他通话相比应该如此之慢?有什么办法可以补救吗?
宽度x高度约为100 x 1000,随着我增加尺寸,调用会越来越慢。
我也尝试使用像素缓冲区对象,但这对性能没有显着影响,它只会延迟缓慢到glMapBuffer()调用。
(我在MacBook Air nVidia 320m显卡OS X 10.6上进行了测试,奇怪的是我的旧款MacBook Intel GMA x3100读取深度缓冲区的速度达到了15 fps。)
UPDATE:将GLUT_MULTISAMPLE从glutInitDisplayMode选项中删除,这使得应用程序再次恢复平稳的20fps。我不知道该选项首先是什么,有人可以解释一下吗?
答案 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对读取深度值无用