2012-06-19 50 views
0

我正在使用Ogre3D及其合成器。在後處理中模糊一點的最快方法

基本上,我想知道什麼是最快的方式來模糊視口中動態點周圍的一切。該點由2D屏幕座標給出。從這一點開始像素越遠,應該越模糊。 爲了讓你瞭解它應該有多少模糊,如果模糊點恰好在屏幕中間,邊緣應該最大程度地模糊。因此,一個像素的模糊係數可以被認爲是

MIN( (normalizedDistanceBetween(像素,blurringPoint)/0.5), 1.0)

所以我假設正確的方式去就是先使用着色器的場景完全模糊的版本。那部分我已經。

現在,如何將這個模糊的圖像與原始場景混合?我看到兩種方式:

  1. 將原始和模糊版本輸入到合成器着色器,讓它計算上述公式的距離和結果,並使用結果混合。
  2. 設置一個額外的渲染到紋理通道,它將使用上述公式來渲染「混合紋理」。重點在於混合紋理可以比屏幕小得多,即使是16x16,結果也不會有太大差異。然後,將原始場景,模糊版本和混合紋理輸入到最終的合成器着色器,該混合紋理器將簡單地從每個像素的混合紋理中採樣一個值,並將其用於將兩個場景版本混合在一起。

第二種方法是否有意義?它會比第一個有明顯的性能增益嗎? (即使是幾個fps?)或者是否通過不爲每個輸出像素計算(相當簡單)距離函數來創建額外的RTT通過和紋理來減輕所有性能?我假設屏幕尺寸是正常的,如1024x768,即比16x16混合紋理大得多。或者還有其他更簡單的方法嗎?

回答

1

其中任一版本都可能具有性能優勢。除非你做的事情特別低效,否則兩種方式都應該相當快。

如果你真的關心它,你應該實現它們並對它們進行基準測試。


如果您還沒有這樣做,您可以通過以半分辨率生成模糊緩衝區來加速效果。這需要一個良好的重採樣濾波器來避免讀取原始場景時出現混淆現象(我推薦至少有一個[1,3,3,1]高斯,可能更寬,如[1,5,10,10,5,1]) 。事實上,如果你想要一個特別寬的最大模糊,你可以重複這個過程,生成一個多分辨率圖像金字塔。 (一旦你間苗你原來,一切都因爲半分辨率意味着1/4的像素變得便宜得多)


另一個可能加速(再次,如果你還沒有嘗試過的話):因爲你的合成正在對原始圖像進行直接的alpha混合,而實際上並不需要對其進行採樣。相反,您可以輸出Alpha通道,渲染到原始緩衝區,並使用光柵化器功能進行最終的合成。