我正在尝试使用 OpenGL 实现真正的运动模糊,但没有累积缓冲区(因为它在我的显卡上不起作用)。这是我的实施想法:
- 每个“模糊”都有一个固定的(临时)空白帧缓冲区和纹理数组
- 每当遇到新帧时,将第一个元素移动到末尾,然后渲染到该帧缓冲区
- 将它们全部渲染,第一帧的不透明度为 1/ n,第二帧的不透明度为 1/( n /2),等等……直到最新的帧为 1。
有没有比这更简单/更快/更优化的方法?或者这是最好的解决方案?
我正在尝试使用 OpenGL 实现真正的运动模糊,但没有累积缓冲区(因为它在我的显卡上不起作用)。这是我的实施想法:
有没有比这更简单/更快/更优化的方法?或者这是最好的解决方案?
NicolBolas 在他的评论中所说的是正确的:要获得真正的运动模糊,您必须应用由每个片段的速度控制的矢量模糊;计算每个顶点的屏幕空间速度,并将其作为另一个统一传递给片段着色器。然后在片段速度的方向和距离上应用矢量模糊。
由于这会与其他片段模糊,因此您最终会遇到透明度排序问题。因此,您应该将其应用为后期处理效果,最好使用深度剥离层。您可以通过使用积压的先前渲染的帧进行混合来节省深度排序的复杂性,这本质上是您建议的帧缓冲区方法,并添加了矢量模糊。
做这种事情有两种一般的方法:
判断这些方法中哪种方法效果更好并非易事。方法(2)的缺点是您要通过很多次,因此开销很大。方法 (1) 将在纹理读取时受到瓶颈。尽管在方法 (1) 中,您最终仍会读取方法 (2) 中的所有数据,但在方法 (1) 中,您将能够利用多个缓存线来获取纹理内存。所以决定性能的两个最重要的因素是
a)你有多少“子帧” b)你的屏幕有多大,因此要读取和写入的纹理有多大。