(本文參考的是《opengl程式設計權威指南》,也就是傳說中的「紅寶書」)
一、快取的分類
1. 顏色快取
指程式設計師繪圖所用的快取,分為:
左、右快取——用於立體感檢視(必須要有左快取);
前、後快取——用於雙快取(必須要有前快取);
4個輔助快取——可選擇的、不可顯示(程式設計師可以自己定義和使用它們)。
2. 深度快取
用來儲存每個象素的深度值,也稱為z快取。
3. 模板快取
可以將作圖限制在螢幕的某些部分中進行。
4.累積快取
包含rgba顏色資料,通常用於將一系列圖象累加成一幅最終的合成圖象。
象素不能直接繪製到累積快取中,累加操作常常先在矩形塊中進行,然後再與顏色快取交換資料。
二、快取的操作
1. 清空快取
(1). 指定要寫入快取的清除值:
glclearcolor()——為顏色快取設定清除值(red,green,blue,alpha);
glclearindex()——為顏色索引快取設定清除值(index);
glcleardepth()——為深度快取設定清除值(預設為1.0);
glclearstencil()——為模板快取設定清除值(預設為0.0);
glclearaccum()——為累積快取設定清除值(red,green,blue,alpha);
(2). 清除指定的快取:
glclear(glbitfield mask);
mask的值是gl_color_buffer_bit、gl_depth_buffer_bit、gl_stencil_buffer_bit和gl_accum_buffer_bit等常數的按位邏輯或(or)。可以一次清除多個快取,如硬體支援同時清除這些快取,則操作同時進行;否則,按順序清除各個快取。
2. 為讀寫操作選擇顏色快取
繪圖操作的結果可以放入任何乙個顏色快取中:前、後、左前、左後、右前、右後或任意輔存,程式設計師可選擇單個快取作為繪圖目標或讀取目標。對繪製圖形而言,也可將目標同時繪製到幾個快取中,用gldrawbuffer()函式來選擇將要寫入的快取;用glreadbuffer()函式來選擇快取,作為glreadpixels()、glcopypixels()、glcopyteximage*()和glcopytexsubimage*()的應用目標。
3. 快取的遮蔽(掩碼)
opengl在向啟用的顏色、深度和模板快取中寫入資料之前,需按下面函式指定的掩碼對這些資料進行遮蔽操作。每個掩碼要與對應的待寫資料進行按位邏輯與(and)操作。
void glindexmask(gluint mask);
mask預設為1。若掩碼中出現1,則顏色索引模式中相應的位被寫入;而在0出現的位,則不寫。
void glcolormask(glboolean red,green,blue,alpha);
預設為gl_true,表示相應的分量已寫入;若為gl_false,則沒寫入。
void gldepthmask(glboolean flag);
預設為gl_true,表示深度快取被啟用用於寫操作;若為gl_false,則取消。
void glstencilmask(gluint mask);
預設為1,和顏色索引類似。
二、片元的測試和操作
在opengl確定了應該生成的片元及繪製顏色後,仍然需要幾個處理過程來控制如何將該片元作為乙個象素繪製到幀快取中,以及確定是否需要這樣做。本節描述了在放入幀快取之前,片元所必須通過的完整測試集合,並且描述了在片元寫入時可能進行的最後操作。測試和操作按下列次序進行,若在前面的測試中片元被刪除,則不再進行後面的測試或操作。
·剪取測試
·alpha測試
·模板測試
·深度測試
·混合·抖動
·邏輯操作
1 .剪取測試
剪取測試只是使用螢幕矩形區域進行的模板測試的翻版,但是由於很容易用硬體快速實現,所以比以軟體方式執行的模板要快。
利用glscissor()函式,可以定義視窗中的乙個矩形區域,並將作圖限制在其中。若片元落在該矩形區,則剪取測試通過,否則片元被刪除。
void glscissor(glint x,glint y,glsizei width,glsizei height);
glenable(gl_scissor_test):啟用剪取測試;
gldisable(gl_scissor_test):取消剪取測試。
預設情況下,矩形與視窗的大小相同,剪取處於取消狀態。
2. alpha測試
在rgba模式下,根據alpha測試中的alpha值,來確定是接收還是拒絕乙個片元。
glenable/gldisable(gl_depth_test):啟用/取消alpha測試
glalphafunc設定alpha測試的參考值和比較函式:
void glalphafunc(glenum func,glclampf ref);
參考值ref取值在0和1之間擷取。引數func的可能值及其含義如下:
gl_never:總不接受該片元;gl_always:總是接受該片元;
gl_less:若片元alpha<參考alpha ,接受該片元;gl_lequal:片元alpha≤參考alpha,接受;
gl_equal:片元alpha=參考alpha,接受;gl_gequal:片元alpha≥參考alpha,接受;
gl_greater:片元alpha>參考alpha,接受;gl_notequal:片元alpha≠參考alpha,接受;
3.模板測試
只在有模板快取的情況下才會發生。如果沒有模板快取,則模板測試總能通過。模板化適用於這樣的測試,這種測試對儲存於模板快取中的象素值與參考值進行比較,根據比較的結果,對模板快取中的值進行修改。
void glstencilfunc(glenum func,glint ref,gluint mask);
此函式為模板測試設定比較函式(func)、參考值(ref)以及掩碼(mask)。利用比較函式可以對參考值和模板快取中的值進行比較,而比較僅適用於掩碼的相應位為1的位。比較函式的可能值與glalphafunc()中的比較函式的可能值相同,但含義相反。
void gltencilop(glenum fail,glenum zfail,glenum zpass);
此函式說明當片元通過或未通過模板測試時,如何對模板快取中的資料進行修正。三個引數fail、zfail、zpass可以為:
gl_keep:保持當前值
gl_zero:以0替換
gl_replace:以參考值替換
gl_incr:增加該值(在0~最大無符號整數值之間)
gl_decr:減小該值(在0~最大無符號整數值之間)
gl_invert:對該值按位取反
若片元未通過模板測試,則應用fail函式;
若片元通過模板測試,但深度測試失敗,則應用zfail函式;
若片元通過模板測試,且通過深度測試,或沒有深度測試,則應用zpass函式。
預設情況下,三個模板操作都是gl_keep。
模板測試最典型的應用就是遮蔽掉螢幕的不規則區域,以避免在該區域作圖。
4. 深度測試
對於螢幕上的每個象素,深度快取時刻追蹤視點與佔據該象素的物體之間的距離。若通過了深度測試,輸入的深度值就將取代深度快取中的相應值。
深度快取通常用於消除隱藏表面的操作。最初,深度快取通常是以距離視點盡可能遠的值來填充的,因此任何物體的深度都比初始狀態更近。
glenalbe(gl_depth_test);//啟用深度測試
glcleardepth(1.0);//清除深度快取
可以用gldepthunc()函式為深度測試選擇不同的比較函式。
void gldepthfunc(glenum func);
此函式為深度測試設定比較函式。func的值必須為gl_never、gl_always、gl_less、gl_lequal、gl_equal、gl_gequal、gl_greater或gl_notequal。如果z值與深度快取中的值滿足確定的關係,則輸入片元通過深度測試。
5. 混合、抖動和邏輯操作
一旦輸入的片元通過了所有的測試,它就可以與顏色快取中的當前內容按某種方式合併起來。最簡單的方法,也是預設操作,就是將當前值覆蓋掉。
在rgba模式中,如果希望片元是半透明的或是消除了鋸齒現象的,程式設計師可以將該片元值與快取中的值作一平均,即混合。
對於可用顏色較少的系統,可以以犧牲解析度為代價,通過顏色值的抖動來增加可用顏色數量。抖動操作是和硬體相關的,opengl允許程式設計師所做的操作就只有開啟或關閉抖動操作。實際上,若機器的解析度已經相當高,啟用抖動操作根本就沒有任何意義。要啟用或取消抖動,可以用glenable(gl_dither)和gldisable(gl_dither)函式。預設情況下,抖動是啟用的。
在顏色索引模式中,可以利用任意的按位邏輯操作,將輸入片元與已寫入的象素進行合成。
OpenGL中的幀快取
一 快取的分類 1.顏色快取 指程式設計師繪圖所用的快取,分為 左 右快取 用於立體感檢視 必須要有左快取 前 後快取 用於雙快取 必須要有前快取 4個輔助快取 可選擇的 不可顯示 程式設計師可以自己定義和使用它們 2.深度快取 用來儲存每個象素的深度值,也稱為z快取。3.模板快取 可以將作圖限制在...
OpenGL幀快取和動畫
17.1 幀快取 螢幕上所繪的圖形都是由象素組成的,每個象素都有乙個固定的顏色或帶有相應點的其它資訊,如深度等。因此在繪製圖形時,記憶體中必須為每個象素均勻地儲存資料,這塊為所有象素儲存資料的記憶體區就叫緩衝區,又叫快取 buffer 不同的快取可能包含每個象素的不等數字的資料,但在給定的乙個快取中...
OpenGL讀取幀快取資料
簡述有些時候我們可能需要獲取渲染後的影象資料,比較常用的函式是glreadpixels,它可以直接把視訊記憶體中的資料拷貝到記憶體中 glreadpixels讀取幀快取資料 void glreadpixels glint x,glint y,glsizei width,glsizei height,...