OpenGL动态对象运动模糊

uyhoqukh  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(116)

我一直在关注GPU Gems3教程,关于如何根据相机移动进行模糊处理。然而,我也想实现一个基于对象移动的模糊。本文介绍了解决方案(请参阅下面的引号),但我很好奇具体如何实现它。
目前,我将对象的矩阵乘以视图投影,然后再分别计算前一个视图投影,然后将它们传递到像素着色器以计算速度,而不仅仅是视图投影。
如果这实际上是正确的方法,那么为什么我不能简单地传递模型-视图-投影?我本以为它们的价值是一样的?
GPU Gems 3 Motion Blur
要为刚体动力学对象生成速度纹理,请使用当前帧的视图投影矩阵和最后一帧的视图投影矩阵来变换对象,然后以与后处理过程相同的方式计算视口位置的差异。应该通过将变换的位置传递到像素着色器并在那里计算速度来计算每个像素的速度。

qjp7pelc

qjp7pelc1#

看看我几个月前做的关于这个主题的研究:https://slu-files.s3.us-east-1.amazonaws.com/Fragment_shader_dynamic_blur.pdf

(来源:stevenlu.net)

(来源:stevenlu.net)
遗憾的是,我在制作这种材质时没有实现纹理对象,但确实使用了您的想象力。我正在开发一个游戏引擎,所以当游戏最终以游戏的形式出现时,你可以肯定我会来这里张贴面包屑。它主要介绍如何在2D中以及在对象不重叠的情况下实现此效果。确实没有一种很好的方法来处理使用碎片着色器来“扫描”采样以生成“准确的”模糊。虽然随着样本数量的增加,效果接近像素完美,但必须生成覆盖扫描区域的几何体必须使用一些“难看的”技术手动组装。
在全3D中,要知道动态对象在帧过程中将扫过哪些像素是一个相当困难的问题。即使是静态的几何体和移动的相机,GPU宝石文章提出的解决方案在快速移动过去的东西时也是不正确的,因为它无法解决需要混合移动物体扫出的区域的问题。
也就是说,如果忽略扫掠的这种近似是足够的(而且可能是),则可以扩展到动力学对象的方法是考虑它们的运动。当然,您需要解决细节问题,但请看链接文章的第二个代码块中的第2行和第5行:它们是像素当前和以前的屏幕空间“位置”。您只需以某种方式传递允许您计算每个像素的先前位置的矩阵,考虑您对象的动态运动。
应该不会太糟。在渲染动力学对象的过程中,需要发送一个额外的矩阵来表示其在最后一帧中的运动。

**更新:**我发现this论文描述了一种优雅且性能良好的方法,它为3D管道提供了某种高质量的物理校正模糊。由于性能原因,在渲染整个场景不超过一次的限制下,很难做得比这更好。

我注意到,在一些例子中,速度缓冲区的质量可能会更好。例如,旋转的车轮应该在速度空间中有一些曲线。我相信如果它们可以正确设置(可能需要自定义碎片着色器来渲染速度...)它们将直观地看起来正确,就像上面我在2D动态运动模糊探索中看到的旋转立方体一样。

相关问题