累積緩存是為合成多幅圖像而設計的,它不是簡單的用引入象素片元來代替象素值,而是將片元進行縮放,然后加到已有的象素值上。為了經過一系列的混合操作后能夠保持精度,累積緩存每個顏色分量的位數要比一般的可視化系統要多。
我們可以象其他緩存一樣清空累積緩存,可以用glClearAccum()來設置紅、綠和藍色分量的清空值,按位順序清空累積緩存或以GL_ACCUM_BUFFER_BIT調用glClear()命令。
你不能直接渲染進累積緩存,而是應該渲染到一個選定的緩存,然后用glAccum()來將在那緩存中的當前圖像累積進累積緩存。glAccum()用當前選擇的讀取緩存來拷貝。你可以用glReadBuffer()來設置你想讀取的緩存。
glAccum()有2個參數:op和value。op值可為下面中的一個:
表1 glAccum()的op值
op值
動作
GL_ACCUM
從當前選定的緩存中讀取象素(該緩存為了用glReadBuffer()進行讀取而選定,用value乘上R、G、B、A值,然后將結果加到累積緩存中。
GL_LOAD
與GL_ACCUM操作類似,但它是用結果值替換掉累積緩存中的值,而不是與之相加。
GL_RETURN
從累積緩存中取值,以value乘以該值,然后將該結果放入為寫操作而激活的顏色緩存中。
GL_ADD
將value值與累積緩存中的每個象素值的R、G、B、A分量相加
GL_MULT
將value值截取到[-1,1]之間,然后與累積緩存中的每象素的R、G、B、A分量相乘
因為你必須在累積之前渲染到另一個緩存,所以累積圖像典型的方法是,將圖像渲染到后緩存若干次,累積每幅圖像到累積緩存中,當所需的圖像數目已累積后,將內容拷貝回后緩存中,然后交換前后緩存。這樣,只有在最后,才顯示累積的圖像。
下面是累積n幅圖像的一個示例程序:
1. 調用glDrawBuffer(GL_BACK)來只渲染到后緩存;
2. 調用glReadBuffer(GL_BACK),這樣累積緩存將從后緩存讀取。
注重:前2步只有當應用程序已經改變了所選的寫和讀緩存時才需要。若可視化系統是雙緩存,這些選擇是默認的。
3. 調用glClear(bitfield)清空后緩存,然后渲染第1幅圖像;
4. 調用glAccum(GL_LOAD,1.f/n);這答應你避免用分開的步驟來清空累積緩存;
5. 改變你的圖像的參數,再重繪它;
6. 調用glAccum(GL_ACCUM,1.f/n)來將第2幅圖像加到第1幅上;
7. 重復前面2個步驟≥n-2次&hell
ip;…
8. 調用glAccum(GL_RETURN,1.f)來將完成的圖像拷貝到后緩存中;
9. 調用glutSwapBuffers()(若使用GLUT)或SwapBuffers()(若使用Win32)來交換前后緩存。
累積緩存提供了一種在保持好的顏色分辨率下實現在場景中“多重曝光(multiple eXPosures)”的方法。使用累積緩存可以產生許多圖像效果來提高圖像的真實性,其中包括:反走樣、運動模糊、軟陰影、深度域(景深)和卷積。要產生這些效果,必須將圖像渲染多次,對場景位置(或所選的物體)進行微小的、漸增的改變,然后累積結果。