2011-03-31 399 views
3

我的应用程序依赖于从帧缓冲区读取深度信息。我已经与glReadPixels(0,0,宽度,高度,GL_DEPTH_COMPONENT,GL_FLOAT,& depth_data)glReadPixels()读取速度缓慢GL_DEPTH_COMPONENT

实现这个然而这种不合理的运行速度慢,它从一个30fps的流畅的laggy 3FPS带来了我的申请。如果我尝试使用其他维度或数据进行回读,它将在可接受的级别上运行。

为了给出的概述:

  • 否glReadPixels - 每秒
  • glReadPixels> 30帧(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英特尔GMA X3100拿到〜15 fps的阅读深度缓冲)。

UPDATE:离开GLUT_MULTISAMPLE出glutInitDisplayMode选项的差异使得应用程序再次回到了平滑的20fps。首先我不知道该选项的作用,任何人都可以解释一下吗?

+0

我知道这是一个非答案但不使用glRead *或glGet *如果fps很重要!如果您只想要渲染目的的深度信息,那么最好编写一个自定义着色器,该着色器可以读取深度缓冲区。如果你真的需要这些深度信息来为你的应用/游戏逻辑,我强烈建议重新考虑整体方法。 – LumpN 2011-03-31 14:48:54

回答

3

如果你的主帧缓冲区是启用了MSAA的(GLUT_MULTISAMPLE存在),那么会创建2个实际的帧缓冲区 - 一个是MSAA和一个常规。

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

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

0

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

如果它不是GLfloat,那么你需要GL在深度缓冲区读取每一个深度的浮点数。 (你的第三颗子弹是一样的,GL_RED是你的颜色缓冲区是一个浮点缓冲区吗?)

+0

我不知道,我没有指定它,并使用GLUT的默认值。我已经尝试glReadPixels文档中的所有类型,并且它们都运行缓慢(除了给出无效参数错误的那些外)。 – 2011-03-31 12:45:15

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对阅读深度值没有用处