使用累加緩存實現運動模糊

以前用OGRE3D的時候,可以使用合成器來實現各種後期效果的合成。個人覺得運動模糊最炫了。於是就自己嘗試着使用OPENGL渲染了一下。本方法完全屬於我個人獨創。(紅寶書裏沒給例子,只是一帶而過。網上的代碼都不完整,看的我頭暈~~於是才決定自己實現~~)。其實,這東東很簡單。首先,你必須理解OPENGL累加緩存的意義和作用。明白自己要實現效果(比如運動模糊,景深,抗鋸齒等等)的基本原理,OK,你就可以自己來實現你所想要的效果了。

 

首先,說說OPENGL累加緩存。和模板緩存一樣,你不能直接去寫它。必須從一個顏色緩存往裏拷貝。實現各種疊加和累積操作之後,再從累加緩存中考到需要的緩存中(比如,顏色緩存)。這樣就可以實現各種幀與幀之間的累積混合效果。

 

使用方法也很簡單:

 

1. 設置刷新默認值, glClearAccum(r,g,b,a);

2. 在需要的時候進行刷新,glClear(GL_ACCUM_BUFFER_BIT); // 建議獨立使用,沒必要和深度、顏色、模板等在一起

3. 在需要的地方進行需要的操作, glAccum( op, value ); // 第一個參數指定操作類型,第二個爲縮放因子(和操作配合使用)

 

詳細的函數說明,可以參考OGL官網地址,如下:

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node115.html

 

下面說說如何實現運動模糊。其實,運動模糊是把多次渲染的畫面進行按比例疊加。如果世界是靜止的,渲染所得到的所有圖像都一樣,那也就無所謂運動模糊了。在OGL裏,我們可以在累加緩存中進行疊加,然後輸出到顏色緩存。OK,太簡單了吧?~是啊,的確很簡單。我的實現都不超過50行代碼,呵呵。下面說說我的實現思路。

 

第一次渲染:

首先,我把累加緩存清空(就清空這麼一次,看來和其他緩存的清空分離是有必要的~)。

然後,渲染一次場景(如果你不想全場景都實現模糊,當然可以隨意選擇部分物體~),完全累加到累加緩存(GL_ACCUM操作,參數1)。

最後,把累加緩存的東東寫到顏色緩存(GL_RETURN操作,參數1)。

 

逐幀渲染:

首先,渲染一次場景,按一定比例累加到累加緩存(GL_ACCUM操作,參數1/N)。

其次,然後縮放累加緩存中的值(GL_MULT操作,參數N/(N+1))。

最後,把累加緩存中的東東寫到顏色緩存(GL_RETURN操作,參數1)。

 

OK,!~一切搞定。~~

這裏對上述操作稍做說明:

首先,因爲要逐幀累加,故第一次要全值拷到顏色緩存,不然,最初顯示會由暗慢慢變量。(呵呵,這不是我需要的效果~~)

其次,因爲不斷的累加顏色,會導致很快超額”曝光“,整個屏幕就一片泛白了~所以,需要在每次累加之後進行適當的縮放。~

最後,N取值要適當,不能太大。否則,拖影會消失的很慢。太小會看不到效果~~(下面截圖,我的取值爲4)

 

好了,看看效果。是不是和OGRE合成器的效果一樣呢~

 

 

呵呵,是不是這樣的粒子系統更炫~~

 

 

 

 

 

 

 

 

呵呵,是不是有點感覺。嗯,作爲對比。再來看看OGRE3D合成器的效果:

 

發佈了64 篇原創文章 · 獲贊 0 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章