0

我正在使用 Ogre3D 和它的合成器。

基本上,我想知道在视口中模糊动态点周围的一切的最快方法是什么。该点由 2D 屏幕坐标给出。像素离该点越远,它应该越模糊。为了让您了解它应该有多少模糊,如果模糊点正好在屏幕的中间,则边缘应该最大程度地模糊。所以像素的模糊系数可以认为是

MIN ( (normalizedDistanceBetween(pixel, blurringPoint)/0.5), 1.0 )

所以我假设正确的方法是首先使用着色器制作完全模糊的场景版本。那部分我已经有了。

现在,如何将这个模糊的图像与原始场景混合?我看到两种方法:

  1. 将原始版本和模糊版本输入到合成着色器中,让它计算距离和上面公式的结果,使用结果进行混合。
  2. 设置一个额外的渲染到纹理通道,它将使用上面的公式来渲染“混合纹理”。关键是混合纹理可以比屏幕小很多,甚至可能是16x16,结果不会有太大差异。然后,将原始场景、模糊版本和混合纹理输入到最终的合成着色器,它会简单地从混合纹理中为每个像素采样一个值,并使用该值将 2 个场景版本混合在一起。

第二种方法有意义吗?它会比第一个有明显的性能提升吗?(甚至几 fps?)或者创建一个额外的 RTT 通道和纹理是否会通过不为每个输出像素计算(相当简单的)距离函数来降低所有性能?我假设屏幕尺寸是正常的,例如 1024x768,即比 16x16 混合纹理大得多。或者还有其他更简单的方法吗?

4

1 回答 1

1

任何一个版本都可能具有性能优势。除非你做的事情特别低效,否则这两种方式都应该相当快。

如果你真的很关心它,你应该同时实现它们,并对它们进行基准测试。


如果您还没有这样做,您可以通过以半分辨率生成模糊缓冲区来加快效果。这需要一个良好的重采样滤波器以避免在读取原始场景时出现混叠(我建议至少使用 [1,3,3,1] 高斯,并且可能更宽,例如 [1,5,10,10,5,1]) .

事实上,如果你想要一个特别宽的最大模糊,你可以重复这个过程,生成一个多分辨率图像金字塔。(一旦你对原始文件进行了下采样,一切都会变得更便宜,因为半分辨率意味着 1/4 像素)


另一个可能的加速(同样,如果您还没有尝试过):由于您的合成器正在与您的原始图像进行直接的 alpha 混合,因此它实际上不需要对其进行采样。相反,您可以输出一个 Alpha 通道,渲染到原始缓冲区,然后使用光栅化器功能进行最终合成。

于 2012-06-20T00:22:42.547 回答