我一直在关注如何基于相机移动进行模糊的GPU Gems 3教程。但是我也希望实现基于对象移动的模糊。解决方案在文章中提供(参见下面的引用),但我很好奇如何实现这一点。
此刻我将对象的矩阵乘以视图投影,然后再分别对前一个视图投影,然后将它们传递到像素着色器以计算速度而不仅仅是视图投影。 / p>
如果这实际上是正确的方法,那么为什么我不能简单地传递模型视图投影?我会假设它们的值相同吗?
要为刚性动态对象生成速度纹理,请使用当前帧的视图投影矩阵和最后一帧的视图投影矩阵来变换对象,然后以与后期相同的方式计算视口位置的差异。处理过程。通过将两个变换位置传递到像素着色器并计算其中的速度,应该按像素计算此速度。
答案 0 :(得分:9)
查看我几个月前就此主题所做的研究:http://www.stevenlu.net/files/motion_blur_2d/Fragment_shader_dynamic_blur.pdf
(2014年12月20日更新:现在由我的网站提供服务,该网站已经在最经济的亚马逊EC2表格中重生,请不要太用力了......)
standard rendering of tower smash http://www.stevenlu.net/files/motion_blur_2d/60_noblur.gif blur rendering of tower smash http://www.stevenlu.net/files/motion_blur_2d/60.gif
遗憾的是,在制作这种材料时我并没有实现纹理对象,但确实使用了你的想象力。我正在研究一个游戏引擎,所以当它最终以游戏的形式看到光明之日时,你可以确定我会来这里发布面包屑。 它主要讨论如何在2D中实现此效果,以及在对象不重叠的情况下。使用片段着色器来“扫描”样本以产生“准确”模糊并没有真正好的方法。虽然随着样本计数的增加,效果接近像素完美,但必须生成以覆盖扫描区域的几何体必须使用一些“丑陋”技术手动组装。
在全3D中,知道动态对象在帧过程中将扫过哪些像素是一个相当困难的问题。即使使用静态几何体和移动相机,GPU Gems文章提出的解决方案在快速移动过程中也是不正确的,因为它无法解决需要混合被移动物体扫过的区域的问题......
也就是说,如果这种忽略扫描的近似值足够(并且可能是),那么扩展到动态对象的方法就是考虑它们的运动。您需要计算出详细信息,但请查看您链接文章的第二个代码块中的第2行和第5行:它们是像素的当前和上一个屏幕空间“位置”。你只需要以某种方式传入矩阵,这将允许你计算每个像素的先前位置,考虑对象的动态运动。
不应该太糟糕。在渲染动态对象的过程中,您将发送一个额外的矩阵,表示其在最后一帧上的运动。