7

我一直在关注如何根据相机移动进行模糊的 GPU Gems 3 教程。但是我也想实现基于对象移动的模糊。该解决方案在文章中介绍(请参阅下面的引用),但是我很好奇如何准确地实现它。

目前我将对象的矩阵乘以视图投影,然后再次分别用于前一个视图投影,然后将它们传递到像素着色器以计算速度而不仅仅是视图投影。

如果这实际上是正确的方法,那么为什么我不能简单地传入模型视图投影?我会假设它们是相同的值?

GPU Gems 3 运动模糊

要为刚体动态对象生成速度纹理,请使用当前帧的视图-投影矩阵和最后一帧的视图-投影矩阵变换对象,然后以与后处理通道相同的方式计算视口位置的差异。应该通过将两个转换后的位置传递到像素着色器并在那里计算速度来计算每个像素的速度。

4

1 回答 1

10

看看我几个月前就这个主题所做的研究: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 探索中看到的旋转立方体一样。

于 2012-08-17T21:56:13.170 回答