看看我几个月前就这个主题所做的研究:http: //www.stevenlu.net/files/motion_blur_2d/Fragment_shader_dynamic_blur.pdf
(来源:stevenlu.net)
(来源:stevenlu.net)
遗憾的是,我在制作这种材料时没有实现纹理对象,但请发挥你的想象力。我正在开发一个游戏引擎,所以当它最终以游戏的形式出现时,你可以确定我会来这里发布面包屑。它主要解决如何在 2D 中以及在对象不重叠的情况下实现此效果。使用片段着色器“扫描”样本以生成“准确”的模糊并不是一个很好的方法。虽然随着样本数量的增加,效果接近像素完美,但必须生成覆盖扫描区域的几何图形必须使用一些“丑陋”的技术手动组装。
在全 3D 中,要知道动态对象在一帧的过程中会扫过哪些像素是一个相当困难的问题。即使使用静态几何体和移动相机,GPU Gems 文章提出的解决方案在快速移动经过物体时也是不正确的,因为它无法解决需要混合移动物体扫过的区域的问题......
也就是说,如果这种忽略扫描的近似是足够的(并且可能是),那么您可以做的是将其扩展到动态对象的方法是考虑它们的运动。您当然需要弄清楚细节,但请查看您链接的文章的第二个代码块中的第 2 行和第 5 行:它们是像素的当前和以前的屏幕空间“位置”。您只需以某种方式传入允许您计算每个像素的先前位置的矩阵,同时考虑到对象的动态运动。
应该不会太糟糕。在渲染动态对象的过程中,您发送一个额外的矩阵,表示其在最后一帧的运动。
更新:
我发现这篇论文描述了一种优雅且高性能的方法,它为 3D 管道提供了某种高质量的物理正确模糊。出于性能原因,在渲染整个场景不超过一次的限制下,很难做得比这更好。
我注意到在一些示例中速度缓冲区的质量可能会更好。例如,一个旋转的轮子在速度空间中应该有一些曲线。我相信如果可以正确设置它们(可能需要自定义片段着色器来渲染速度...),它们将看起来直观正确,就像上面我对动态运动模糊的 2D 探索中看到的旋转立方体一样。