首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL -使用FBO更新循环中的纹理时,性能较差且结果不正确

OpenGL -使用FBO更新循环中的纹理时,性能较差且结果不正确
EN

Stack Overflow用户
提问于 2013-06-08 01:44:24
回答 2查看 715关注 0票数 0

首先:

nVidia XP SP3,2 1GB内存,英特尔酷睿2双核2.33 GHz,Windows 9600GT 1 1GB内存。OpenGL 3.3完全更新。

对我正在做的事情的简短描述:

理想情况下,我需要在每帧使用glTexSubImage2D的GL纹理(A)中放置一个单独的像素。

然后,修改着色器- FBO -四面相机设置中的纹理,并用生成的FBO替换原始图像。

当然,我不想要FBO反馈循环,所以我将修改后的版本放在一个临时纹理中,并使用glCopyTexSubImage2D单独进行更新。

序列现在是:

1)在GL纹理中放置一个像素(A),每帧使用glTexSubImage2D (使用width=height=1)。

2)这个修改的版本A将在shader-FBO-quad设置中使用/修改,以渲染到不同的纹理(B)。

3)生成的纹理B将使用glCopyTexSubImage2D覆盖A。

4)重复...

通过重复这个循环,我希望通过每帧将着色器中的颜色值乘以0.99来实现缓慢淡入淡出的效果。

有两件事是严重错误的:

1)在每帧重复0.99的衰落因子的情况下,衰落停止于RGB 48,48,48。因此,留下了一条未完全淡出的灰色像素轨迹。

2)程序以100FPS运行。非常糟糕。因为如果我注释掉glCopyTexSubImage2D,程序的速度是1000FPS!!

我也是通过注释掉glTexSubImage2D而不使用glCopyTexSubImage2D来实现1000FPS的。这一事实澄清了glTexSubImage2D和glCopyTexSubImage2D本身并不是瓶颈(我试图用辅助FBO替换glCopyTexSubImage2D来执行复制,结果相同)。

观察:瓶颈显示这两个命令何时都在工作!

硬模式:请不要PBOs。

与源代码和exe的链接:

http://www.mediafire.com/?ymu4v042a1aaha3

(使用CodeBlocks和SDL )

FPS计数写入stdout.txt

我要求对上面暴露的两件事采取变通办法。

预期效果: 800-1000帧/秒的纯黑色完全淡出效果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-12 05:10:02

问题2:尽可能快地将任意像素拼接到纹理中。

由于从主存动态上传数据到GPU的绝对最快的方法可能是在顶点数组或VBO中,因此问题2的解决方案变得微不足道:

1)创建顶点数组和颜色数组

(或交错坐标和颜色,性能/带宽可能不同);

2) Z分量=0。我们希望点数躺在地板上;

3)使用正交投影向下指向的相机

(确保屏幕尺寸与坐标范围完全匹配);

4)使用带glPointSize=1的GL_POINTS和禁用的GL_POINT_SMOOTH在FBO下渲染到纹理。

相当标准。现在程序以750帧/秒的速度运行。足够接近了。我的梦都像是“嘿,妈妈,看!我在以1000fps的速度运行glTexSubImage2D!”然后呢。

虽然glCopyTexSubImage2D非常快。会推荐。

不确定这是否是GPU加速淡入淡出的最好方法,但考虑到结果,必须注意到这一点的强大集中力。无论如何,通过设置一个最小常量递减变量来解决衰落中途停止的问题,因此即使指数曲线失败,衰落也将结束。

票数 0
EN

Stack Overflow用户

发布于 2013-06-08 03:59:06

对于问题1:

您在这里遇到了一些精度(和量化)问题。我假设你使用的是8位的UNORM帧缓冲格式,所以你写的任何东西都会在256级之外的下一个离散步骤中被四舍五入。想想看: 48*0.99 = 47.52,它会再次变成48,所以它不会变得更暗。使用一些真正的浮点格式将是一个解决方案,但它可能会极大地降低整体性能...

您选择的淡出操作根本不是最好的选择,添加一些线性项可能会更好,以保证您至少将该值减少1/255。

对于问题2:很难说这里的实际瓶颈是什么。由于您未使用PBO,因此仅限于同步纹理更新。

但是,为什么需要执行复制操作呢?处理这类事情的标准方法是一些纹理/FBO/颜色缓冲区“乒乓”,你只需在每次迭代后交换纹理的“角色”。这样你就得到了这个序列:

  1. 更新A
  2. 渲染到B(从A读取)
  3. 更新B
  4. 渲染到A(从B读取)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16990032

复制
相关文章

相似问题

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