opengl除了顏色緩衝區、深度緩衝區、模板緩衝區之外,還有累積緩衝區。累積緩衝區允許你把渲染到顏色緩衝區的值,拷貝到累積緩衝區。在多次拷貝操作到累積緩衝區時,可以用不同方式的把顏色緩衝區內容和當前累積緩衝區的內容進行重複混合。當在累積緩衝區完成一幅影象之後,可以拷回顏色緩衝區,然後通過swapbuffers顯示到螢幕上。
累積緩衝區的操作通過void glaccum(glenum op, glfloat value);控制。第乙個引數表示對累積緩衝區所進行的操作。第二個引數是浮點數用於指定縮放因子。
opengl支援的累積緩衝區的操作如下表:
操作描述
gl_accum
把顏色緩衝區的顏色值進行縮放後,累加到累積緩衝區
gl_load
把顏色緩衝區的顏色值進行縮放後,替換掉累積緩衝區的顏色值
gl_return
把累積緩衝區的顏色值縮放後,拷貝回顏色緩衝區
gl_mult
把累積緩衝區的顏色值縮放後,替換掉原累積緩衝區的顏色值
gl_add
把累積緩衝區的顏色值縮放後,累加到累積緩衝區
由於累積緩衝區會帶來大記憶體的開銷,所以在實時應用程式中比較少用。但在非實時的應用程式中,可以產生實時應用程式無法做到的效果。例如,你可以多次渲染場景,並在每次渲染時進行抖動零點幾個畫素,這樣就可以產生整個場景的反走樣的效果,比多重取樣的效果還要好。還可以模糊前景或背景,然後清晰的渲染乙個物體來模擬,照相機景深的效果。
下面的例子是乙個球體在地板上滾動,運動模糊的效果。
[cpp]view plain
copy
#include
#include
#include
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"opengl32.lib")
#include
#include
using
namespace
std;
glfloat flightpos[4] = ;
glfloat fnolight = ;
glfloat flowlight = ;
glfloat fbrightlight = ;
static
glfloat yrot;
void
drawground()
else
glvertex3f(x, y, z);
glvertex3f(x + step, y, z);
icolor++;
} glend();
} glshademodel(gl_smooth);
} void
drawgemometry()
glpopmatrix();
} void
renderscene()
else
} glaccum(gl_return, 1.0f);
glutswapbuffers();
} void
changesize(glsizei w, glsizei h)
glviewport(0, 0, w, h);
glfloat faspect = (glfloat)w/(glfloat)h;
glmatrixmode(gl_projection);
glloadidentity();
gluperspective(35.0f, faspect, 1.0f, 50.0f);
glmatrixmode(gl_modelview);
glloadidentity();
gltranslatef(0.0f, -0.4f, 0.0f);
glutpostredisplay();
} void
setuprc()
intmain(
intargs,
char
**argv)
drawgeometry函式繪製了場景中的所有幾何圖元。在renderscene中反覆呼叫這個函式,並把結果累積到累積緩衝區中。在最後,拷貝回到顏色緩衝區,然後glutswapbuffers顯示到螢幕上:
顏色掩碼
在計算後的最終顏色將要寫入到顏色緩衝區時,opengl允許你通過glcolormask函式來遮蔽掉其中的乙個或多個通道值。
void glcolormask(glboolean red, glboolean green, glboolean blue, glboolean alpha);
引數分別代表紅、綠、藍、alpha通道。當傳的引數是gl_true時,表示允許往這個通道的寫值,如果為gl_false則阻止往該通道寫值。
顏色邏輯操作
許多2d的圖形api允許源顏色和目的顏色進行邏輯操作。opengl也支援這種操作:
void gllogicop(glenum op);
還需要通過glenable(gl_color_logic_op);來開啟。opengl在預設情況下是關閉的。關閉操作是相應的gldisable
op允許的操作如下表:
引數值操作
gl_clear
0gl_and
s & d
gl_and_reverse
s & ~d
gl_copy
sgl_and_inverted
~s & d
noop
dxor
s xor d
ors | d
nor~(s | d)
gl_equiv
~(s xor d)
gl_or_reverse
s | ~d
gl_copy_inverted
~sgl_or_inverted
~s | d
gl_nand
~(s & d)
setall 1s
alpha 測試
alpha測試允許你告訴opengl那些在alpha測試不通過的輸入片段將被廢棄。那些被廢棄的片段不會寫入到顏色緩衝區,深度緩衝區,模板緩衝區和累積緩衝區中。那些alpha值很低的片段可能是不可見的,因此我們可以過濾掉它,不寫入到緩衝區中,可以提高效能。
alpha測試值和比較函式可以通過glalphafunc指定:
void glalphafunc(glenum func, glclampf ref);
ref的取值範圍為[0.0, 1.0].可以指定的比較方式如下表:
比較方式
描述gl_never
永遠不通過
gl_always
一直通過
gl_less
小於ref
gl_lequal
小於等於ref
gl_equal
等於ref
gl_gequal
大於等於ref
gl_greater
大於ref
gl_notequal
不等於ref
行為與gldepthfunc函式相似。可以通過glenable/gldisable來開啟和關閉alpha測試,引數值是gl_alpha_test。
抖動抖動允許只有少量離散顏色的顯示系統來模擬更寬範圍的顏色。例如,灰色可以通過白點和黑點的混合來模擬。白點多於黑點呈現淺灰色,黑點多於白點呈現深灰色。這種技巧對於只支援8位和16位的顯示系統非常有用。抖動的效果可以大幅度地改善低端顏色系統的影象質量。在預設情況下,抖動是開啟的。可以通過glenable(gl_dither)/gldisable(gl_dither)來開啟或關閉它。在高顏色解析度的顯示系統中,opengl的實現可能不需要抖動,會禁用抖動來避免效能的開銷。
OpenGL 累積緩衝區glAccum
opengl除了顏色緩衝區 深度緩衝區 模板緩衝區之外,還有累積緩衝區。累積緩衝區允許你把渲染到顏色緩衝區的值,拷貝到累積緩衝區。在多次拷貝操作到累積緩衝區時,可以用不同方式的把顏色緩衝區內容和當前累積緩衝區的內容進行重複混合。當在累積緩衝區完成一幅影象之後,可以拷回顏色緩衝區,然後通過swapbu...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
使用者程序緩衝區和核心緩衝區
常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...