没有累积缓冲区的OpenGL运动模糊

时间:2013-05-08 08:04:56

标签: c++ algorithm opengl motion-blur

我正在尝试使用OpenGL实现真实的运动模糊,但没有累积缓冲区(因为它不能在我的显卡上工作)。以下是我对实施的想法:

  • 有一个固定数组的(临时)空白帧缓冲区&每个“模糊”的纹理
  • 每当遇到新帧时,将第一个元素移动到结尾,然后渲染到那个帧缓冲区
  • 将它们全部渲染,第一帧具有1 / n 不透明度,第二帧具有1 /( n / 2)等等......直到最新的1具有1

有没有比这更简单/更快/更优化的方法?或者这是最好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

NicolBolas在他的评论中所说的是正确的:要获得真正的运动模糊,你必须应用由每个片段的速度控制的矢量模糊;计算每个顶点的屏幕空间速度,并将其作为另一个统一传递给片段着色器。然后在片段速度的方向和距离上应用矢量模糊。

由于这会与其他片段模糊,因此最终会出现透明度排序问题。因此,您应该将其应用为后期处理效果,理想情况下应使用深度去皮层。您可以通过使用先前渲染的帧的积压来节省深度排序的复杂性,这实际上是您建议的帧缓冲方法,添加了矢量模糊。

答案 1 :(得分:0)

执行此类操作有两种常规方法:

  1. 分别渲染最终帧的每个“子帧”,然后在最后一遍中组合所有这些子帧
  2. 按子帧渲染子帧,在每次传递中,您将读取前一遍的结果,将其乘以您的权重系数,因此您的最终传递将是所有这些传递的组合。
  3. 告诉哪些方法可以更好地工作并非易事。方法(2)的缺点是你进行了很多次传递,因此需要很多开销。方法(1)将在纹理读数处进行瓶颈处理。虽然在方法(1)中你仍然最终读取了方法(2)中的所有数据,但在方法(1)中,你将能够利用多个缓存行来进行纹理内存提取。 因此,决定绩效的两个最重要的因素是

    a)你有多少个“子帧” b)你的屏幕有多大,因此要读取和写入的纹理有多大。