我的应用程序依赖于从帧缓冲区读取深度信息。我已经用 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/