以前用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合成器的效果: