首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glReadPixels()慢读GL_DEPTH_COMPONENT

glReadPixels()慢读GL_DEPTH_COMPONENT
EN

Stack Overflow用户
提问于 2011-03-31 12:19:01
回答 3查看 2.9K关注 0票数 4

我的应用程序依赖于从框架缓冲区读取深度信息。我已经用glReadPixels(0,0,宽度,高度,GL_DEPTH_COMPONENT,GL_FLOAT,&depth_data)实现了这一点。

然而,这运行不合理的慢,它带来了我的应用程序从一个平滑的30 3fps到一个滞后的3fps。如果我试图读取其他维度或数据,它运行在一个可接受的水平上。

概述:

( second

  • glReadPixels(0,0,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&depth_data);-> 20帧每秒,acceptable

  • glReadPixels(0,0,宽度,高度,GL_RED,GL_FLOAT,&depth_data);-> 20帧每秒,acceptable

  • glReadPixels(0,0,宽度,GL_FLOAT,&depth_data);->每秒3帧,不被接受# per 20# per 20# per 20#

为什么最后一个电话要比其他电话慢呢?有什么办法补救吗?

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

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

(我在MacBook Air nVidia 320米图形操作系统X10.6上测试了这一点,奇怪的是,我的旧MacBook英特尔GMA x3100获得了15 fps的深度缓冲区。)

更新:将GLUT_MULTISAMPLE排除在glutInitDisplayMode选项之外,产生了天壤之别,再次使应用程序恢复到平稳的20 out。我一开始不知道该怎么做,有人能解释一下吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-31 13:27:23

如果您的主框架缓冲区是启用MSAA的(GLUT_MULTISAMPLE存在),那么将创建两个实际的帧缓冲区-一个带有MSAA,一个是常规的。

第一个是你需要填补的。它包含正面和背面颜色表面,加上深度和模板。第二个只能包含通过解析相应的MSAA表面而产生的颜色。

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-31 12:26:59

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

如果不是GLfloat,那么您将要求GL转换深度缓冲区中的每个深度,以便在读取它时浮动。(你的第三颗子弹也是这样,和GL_RED一样。您的Color缓冲区是浮动缓冲区吗?)

票数 1
EN

Stack Overflow用户

发布于 2013-01-18 05:48:58

无论是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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5499729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档