我正在使用 Ogre3D 和它的合成器。
基本上,我想知道在视口中模糊动态点周围的一切的最快方法是什么。该点由 2D 屏幕坐标给出。像素离该点越远,它应该越模糊。为了让您了解它应该有多少模糊,如果模糊点正好在屏幕的中间,则边缘应该最大程度地模糊。所以像素的模糊系数可以认为是
MIN ( (normalizedDistanceBetween(pixel, blurringPoint)/0.5), 1.0 )
所以我假设正确的方法是首先使用着色器制作完全模糊的场景版本。那部分我已经有了。
现在,如何将这个模糊的图像与原始场景混合?我看到两种方法:
- 将原始版本和模糊版本输入到合成着色器中,让它计算距离和上面公式的结果,使用结果进行混合。
- 设置一个额外的渲染到纹理通道,它将使用上面的公式来渲染“混合纹理”。关键是混合纹理可以比屏幕小很多,甚至可能是16x16,结果不会有太大差异。然后,将原始场景、模糊版本和混合纹理输入到最终的合成着色器,它会简单地从混合纹理中为每个像素采样一个值,并使用该值将 2 个场景版本混合在一起。
第二种方法有意义吗?它会比第一个有明显的性能提升吗?(甚至几 fps?)或者创建一个额外的 RTT 通道和纹理是否会通过不为每个输出像素计算(相当简单的)距离函数来降低所有性能?我假设屏幕尺寸是正常的,例如 1024x768,即比 16x16 混合纹理大得多。或者还有其他更简单的方法吗?