OpenGL 累積緩衝區glAccum

2021-06-20 15:43:03 字數 3757 閱讀 1983

opengl除了顏色緩衝區、深度緩衝區、模板緩衝區之外,還有累積緩衝區。累積緩衝區允許你把渲染到顏色緩衝區的值,拷貝到累積緩衝區。在多次拷貝操作到累積緩衝區時,可以用不同方式的把顏色緩衝區內容和當前累積緩衝區的內容進行重複混合。當在累積緩衝區完成一幅影象之後,可以拷回顏色緩衝區,然後通過swapbuffers顯示到螢幕上。

累積緩衝區的操作通過void glaccum(glenum op, glfloat value);控制。第乙個引數表示對累積緩衝區所進行的操作。第二個引數是浮點數用於指定縮放因子。

opengl支援的累積緩衝區的操作如下表:

操作描述

gl_accum

把顏色緩衝區的顏色值進行縮放後,累加到累積緩衝區

gl_load

把顏色緩衝區的顏色值進行縮放後,替換掉累積緩衝區的顏色值

gl_return

把累積緩衝區的顏色值縮放後,拷貝回顏色緩衝區

gl_mult

把累積緩衝區的顏色值縮放後,替換掉原累積緩衝區的顏色值

gl_add

把累積緩衝區的顏色值縮放後,累加到累積緩衝區

由於累積緩衝區會帶來大記憶體的開銷,所以在實時應用程式中比較少用。但在非實時的應用程式中,可以產生實時應用程式無法做到的效果。例如,你可以多次渲染場景,並在每次渲染時進行抖動零點幾個畫素,這樣就可以產生整個場景的反走樣的效果,比多重取樣的效果還要好。還可以模糊前景或背景,然後清晰的渲染乙個物體來模擬,照相機景深的效果。

下面的例子是乙個球體在地板上滾動,運動模糊的效果。

#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()

int main(int args, 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除了顏色緩衝區 深度緩衝區 模板緩衝區之外,還有累積緩衝區。累積緩衝區允許你把渲染到顏色緩衝區的值,拷貝到累積緩衝區。在多次拷貝操作到累積緩衝區時,可以用不同方式的把顏色緩衝區內容和當前累積緩衝區的內容進行重複混合。當在累積緩衝區完成一幅影象之後,可以拷回顏色緩衝區,然後通過swapbu...

opengl模板緩衝區

相信大家有些人對opengl的模板緩衝區不是很理解,包括我最開始也是,opengl的模板緩衝區其實就是採用過濾的技術來控制那些顏色可以繪製,那些不能進行繪製。這裡的過濾技術也就是我們的乙個控制方法,主要體現在如下兩個函式glstencilfunc glenum func,glint ref,glui...

OpenGL緩衝區物件

opengl 緩衝區物件 今天學習了一下緩衝區物件.opengl是按照客戶機 伺服器模式設計的,在opengl需要資料的時候,都必須把資料從客戶機內傳輸到伺服器。緩衝區物件,允許應用程式現實的指定把哪些資料儲存在圖形伺服器。1.建立緩衝區物件 glgenbuffers opengl分配n個當前未使用...