Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance glReadPixels()读取GL\u DEPTH\u组件时速度较慢_Performance_Opengl_Framebuffer_Glreadpixels - Fatal编程技术网

Performance glReadPixels()读取GL\u DEPTH\u组件时速度较慢

Performance glReadPixels()读取GL\u DEPTH\u组件时速度较慢,performance,opengl,framebuffer,glreadpixels,Performance,Opengl,Framebuffer,Glreadpixels,我的应用程序依赖于从帧缓冲区读回深度信息。我已经用glReadPixels(0、0、宽度、高度、GL\u深度分量、GL\u浮点和深度数据)实现了这一点 然而,这运行速度非常慢,它将我的应用程序从平滑的30fps提高到了滞后的3fps。如果我尝试读取其他维度或数据,它将在可接受的级别上运行 概述一下: 无glReadPixels->每秒30帧 glReadPixels(0、0、1、1、GL_深度分量、GL_浮点和深度数据);->每秒20帧,可接受 glReadPixels(0、0、宽度、高度、G

我的应用程序依赖于从帧缓冲区读回深度信息。我已经用glReadPixels(0、0、宽度、高度、GL\u深度分量、GL\u浮点和深度数据)实现了这一点

然而,这运行速度非常慢,它将我的应用程序从平滑的30fps提高到了滞后的3fps。如果我尝试读取其他维度或数据,它将在可接受的级别上运行

概述一下:

  • 无glReadPixels->每秒30帧
  • glReadPixels(0、0、1、1、GL_深度分量、GL_浮点和深度数据);->每秒20帧,可接受
  • glReadPixels(0、0、宽度、高度、GL_红色、GL_浮动和深度_数据);->每秒20帧,可接受
  • glReadPixels(0、0、宽度、高度、GL_深度分量、GL_浮点和深度数据);->每秒3帧,不可接受
为什么最后一个电话比其他电话慢?有办法补救吗

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

我也尝试过使用pixel buffer对象,但这对性能没有显著影响,它只会延迟速度,直到调用glMapBuffer()为止

(我已经在MacBook Air nVidia 320m图形操作系统X 10.6上进行了测试,奇怪的是,我的旧MacBook Intel GMA x3100读取深度缓冲区的速度达到了15 fps。)


更新:将GLUT\u MULTISAMPLE从glutInitDisplayMode选项中去掉,使应用程序重新恢复到平滑的20fps,这是一个巨大的变化。我不知道这个选项首先做什么,有人能解释一下吗?

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


如果它不是GLfloat,那么在读取它时,您要求GL将深度缓冲区中的每个深度转换为float。(与第三个项目符号相同,使用GL_RED。颜色缓冲区是浮动缓冲区吗?

如果主帧缓冲区启用了MSAA(存在GLUT_MULTISAMPLE),则会创建两个实际帧缓冲区-一个使用MSAA,另一个为常规帧缓冲区

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


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

无论是GL\u浮点还是GL\u无符号字节,glReadPixels仍然非常慢。如果您使用PBO获得RGB值,它将非常快。
使用PBO处理RGB值时,CPU使用率为4%。但当处理深度值时,它将增加到50%。我试过GL_FLOAT,GL_UNSIGNED_BYTE,GL_UNSIGNED_INT,GL_UNSIGNED_INT 24_8。所以我可以得出结论,PBO对于读取深度值是无用的

我不知道,我没有指定它,而是使用了GLUT默认值。我已经尝试了glReadPixels文档中的每种类型,但它们都运行缓慢(除了那些给出无效参数错误的类型)。我知道这是一个非答案,但如果fps很重要,请不要使用glRead*或glGet*!如果希望深度信息仅用于渲染目的,最好编写一个具有深度缓冲区读取权限的自定义着色器。如果你真的需要应用程序/游戏逻辑的深度信息,我强烈建议重新考虑整体方法。