Performance glReadPixels()读取GL\u DEPTH\u组件时速度较慢
我的应用程序依赖于从帧缓冲区读回深度信息。我已经用glReadPixels(0、0、宽度、高度、GL\u深度分量、GL\u浮点和深度数据)实现了这一点 然而,这运行速度非常慢,它将我的应用程序从平滑的30fps提高到了滞后的3fps。如果我尝试读取其他维度或数据,它将在可接受的级别上运行 概述一下: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->每秒30帧
- glReadPixels(0、0、1、1、GL_深度分量、GL_浮点和深度数据);->每秒20帧,可接受
- glReadPixels(0、0、宽度、高度、GL_红色、GL_浮动和深度_数据);->每秒20帧,可接受
- glReadPixels(0、0、宽度、高度、GL_深度分量、GL_浮点和深度数据);->每秒3帧,不可接受
更新:将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*!如果希望深度信息仅用于渲染目的,最好编写一个具有深度缓冲区读取权限的自定义着色器。如果你真的需要应用程序/游戏逻辑的深度信息,我强烈建议重新考虑整体方法。