首先:
Windows XP SP3,2GB RAM,Intel核心2 Duo 2.33 GHz,nVidia 9600GT 1GB RAM。 OpenGL 3.3完全更新。
我正在做什么的简短说明:
理想情况下,我需要每帧使用glTexSubImage2D在GL纹理(A)中放置一个像素。
然后,修改着色器内的纹理-FBO- quadfacingcamera设置并用生成的FBO替换原始图像。
当然,我不想要FBO反馈循环,所以我将修改后的版本放在临时纹理中,并使用glCopyTexSubImage2D单独进行更新。
序列现在是:
1)每帧使用glTexSubImage2D(宽度=高度= 1)在GL纹理(A)中放置一个像素。
2)在着色器-FBO-中使用/修改此修改版本A.将四重设置渲染成不同的纹理(B)。
3)使用glCopyTexSubImage2D将结果纹理B覆盖在A上。
4)重复...
通过重复此循环,我希望通过将着色器中的颜色值乘以每帧0.99来实现慢速淡化效果。
2件事情严重错误:1)每帧重复衰减0.99,衰落在RGB 48,48,48处停止。因此,留下灰色像素的痕迹并未完全消失。
2)程序以100 FPS运行。很坏。因为如果我注释掉了glCopyTexSubImage2D,程序的速度就会达到1000 FPS !!
我通过只注释glTexSubImage2D并且只留下glCopyTexSubImage2D来实现1000 FPS。这个事实澄清了glTexSubImage2D和glCopyTexSubImage2D本身并不是瓶颈(我试图用辅助FBO替换glCopyTexSubImage2D进行复制,结果相同)。
观察:瓶颈显示这些命令何时起作用!
硬模式:没有PBO请。
与source和exe链接:
http://www.mediafire.com/?ymu4v042a1aaha3
(使用CodeBlocks和SDL)
将FPS计数写入stdout.txt
我要求解决暴露在那里的2件事情。
预期结果:800-1000 FPS的纯黑色完全淡出效果。
答案 0 :(得分:0)
问题1:
您在这里遇到一些精确(和量化)问题。我假设您正在使用一些8位UNORM帧缓冲区格式,因此您写入它的任何内容都将在256级别的下一个离散步骤中舍入。想一想:48 * 0.99 = 47.52,它最终会再次变为48,所以它不会变暗。使用一些真正的浮点格式将是一个解决方案,但它可能会大大降低整体性能......
您选择的淡出操作根本不是最佳选择,添加一些线性术语可能会更好,以保证您将值减少至少1/255。
问题2: 很难说这里的实际瓶颈是什么。由于您没有使用PBO,因此仅限于同步纹理更新。
但是,为什么你需要完成复制操作呢?这种事情的标准方法是一些纹理/ FBO /颜色缓冲“乒乓”,你只需在每次迭代后交换纹理的“角色”。所以你得到了序列:
答案 1 :(得分:0)
问题2:尽可能快地将任意像素喷射到纹理中
由于从主存储器动态上传数据到GPU的绝对最快的方法可能是顶点阵列或VBO,因此问题2的解决方案变得微不足道:
1)创建顶点阵列和颜色阵列
(或交错坐标和颜色,性能/带宽可能不同);
2)Z分量= 0。我们希望积分在地板上;
3)相机向下指向正交投影
(确保精确匹配屏幕尺寸与坐标范围);
4)使用GL_POINTS渲染到FBO纹理w / glPointSize = 1且GL_POINT_SMOOTH禁用。
非常标准。现在该程序以750 fps运行。足够近。我的梦想都像是“嘿妈妈看!我以1000 fps的速度运行glTexSubImage2D!”然后meh。
虽然glCopyTexSubImage2D非常快。会推荐。
不确定这是否是GPU加速衰落的最佳方式,但考虑到结果,必须注意到这一点强烈集中力量。无论如何,通过设置最小常数减量变量来解决中断停止中断的问题,因此即使指数曲线失败,无论如何都会完成衰落。