4

我的应用程序依赖于从帧缓冲区读取深度信息。我已经用 glReadPixels(0, 0, width, height, 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, 宽度, 高度, GL_RED, GL_FLOAT, &depth_data); -> 每秒 20 帧,可接受
  • glReadPixels(0, 0, 宽度, 高度, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data); -> 每秒 3 帧,不可接受

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

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

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

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

更新:将 GLUT_MULTISAMPLE 排除在 glutInitDisplayMode 选项之外,让应用程序再次恢复到平滑的 20fps 带来了天壤之别。我不知道该选项首先是做什么的,谁能解释一下?

4

3 回答 3

3

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

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

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

于 2011-03-31T13:27:23.460 回答
1

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

如果它不是 GLfloat,那么您要求 GL 在读取深度缓冲区时将其转换为浮动。(你的第三个子弹也是一样的,使用 GL_RED。你的颜色缓冲区是浮点缓冲区吗?)

于 2011-03-31T12:26:59.857 回答
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 对于读取深度值是没有用的

于 2013-01-18T05:48:58.937 回答