我想通过在帧的过程中在轨迹中的多个点处渲染和叠加运动对象来创建运动模糊效果。
我在想,确定绘图位置的计算可以在顶点着色器中执行。但在我看来,如果我想避免为每个渲染传递几何体,我可能需要使用几何着色器。
我最好的行动方案是什么?我决定:
我想在这里取得的平衡是我希望最少的冗余数据传递,同时尽可能多地支持硬件。看起来我应该能够使用顶点缓冲区对象来存储我的几何数据,并且只需传递一些制服即可将速度数据发送到每个渲染上的顶点着色器。那样有用吗? VBO缓冲区也是持久的,所以为了获得最佳性能,我应该根据需要踩入并修改几何数据,对吗?
另一个我不知道如何处理的潜在问题是我想通过插入刚性物体在一个帧上遍历的平移和旋转来精确地绘制我的中间位置,而不是仅仅插入合成的顶点位置。这里的区别在于旋转物体会留下弯曲的条纹。
是否有某种方法可以防止必须为每个单独的动态刚性对象发出调用?也许我可以使用通用顶点属性来发送我的速度?这有点多余,因为我可以拥有一个具有相同速度数据的100个顶点的对象,但至少我的着色器可以通过这种方式得到这些数据的流。
在我看来,通过在GPU上执行顶点变换可能没有太多的收获:我必须传递速度向量,角速度标量和质心向量作为顶点属性。这似乎是对带宽的巨大浪费。但是,我可以将该数据用于潜在的大量“样本”(子帧渲染)。
我已经使用OpenGL立即模式很长一段时间了,但这次我想做正确的事情。
更新:请参阅扩展评论讨论,了解其采取的方向。我现在相当肯定,由于“闪光灯效果”,多个样品不会产生好的结果:在某些速度下,出于性能原因,我需要使用模糊。在那种情况下,我需要累积模糊的子帧;渲染子帧然后模糊它仍然会留下瑕疵。
答案 0 :(得分:3)
我想通过在帧的过程中在轨迹中的多个点处渲染和叠加混合移动对象来创建运动模糊效果。
这当然是实现运动模糊的一种方法。但是现在,运动模糊是通过片段着色器中的矢量模糊后处理过滤器实现的。有关其工作原理的说明,请参阅http://www.blender.org/development/release-logs/blender-242/vector-blur/。对于实时,必须使用后处理着色器重现该过程。
答案 1 :(得分:2)
顶点着色器 - 您可以这样做,但不要尝试发送几何体速度,只需发送顶点速度:
将帧渲染为VBO,调用glVertexAttrib以包含每个顶点的当前速度和加速度。重复渲染VBO,为每个子帧指定一个统一值的时间偏移量。
然后,顶点着色器需要根据统一时间值应用offests。
几何着色器 - 如果您使用它,您可以像#2一样实现它,除了“循环和变化”将在着色器中实现 - 帮助将更多工作卸载到GPU。
你还提到: