17.1、幀快取
螢幕上所繪的圖形都是由象素組成的,每個象素都有乙個固定的顏色或帶有相應點的其它資訊,如深度等。因此在繪製圖形時,記憶體中必須為每個象素均勻地儲存資料,這塊為所有象素儲存資料的記憶體區就叫緩衝區,又叫快取(buffer)。不同的快取可能包含每個象素的不等數字的資料,但在給定的乙個快取中,每個象素都被賦予相同數字的資料。存貯一位象素資訊的快取叫位面(bitplane)。系統中所有的快取統稱為幀快取(framebuffer),可以利用這些不同的快取進行顏色設定、隱藏面消除、場景反走樣和模板等操作。
17.1.1 幀快取組成
opengl幀快取由以下四種快取組成:
17.1.2 快取清除
前面幾章內容裡已經提到快取清除的應用,這裡將詳細解釋這些函式。在許多圖形程式中,清屏或清除任何乙個快取,一般來說操作開銷都很大。例如,在乙個1280*1024的螢幕上,它要求對成千上萬個象素進行操作。通常,對於乙個簡單的繪圖程式,清除操作可能要比繪圖所花費的時間多得多。如果不僅僅只清除顏色快取,而還要清除深度和模板等快取的話,則將花費三四倍的時間開銷。因此,為了解決這個問題,許多機器都用硬體來實現清屏或清除快取操作。opengl清除快取操作過程是:先給出要寫入每個快取的清除值,然後用單個函式命令執行操作,傳入所有要清除的快取表,若硬體能同時清除,則這些清除操作可以同時進行;否則,各個操作依次進行。
下面這個函式為每個快取設定清除值:
void glclearcolor(glclampf red,glclampf green,glclampf blue,glclampf alpha);
void glclearindex(glfloat index); void glcleardepth(glclampd depth);
void glclearstencil(glint s);
void glclearaccum(glflaot red,glfloat green,glfloat blue,glfloat alpha);
以上函式分別為rgba方式下的顏色快取、顏色表方式下的顏色快取、深度快取、模板快取和累積快取說明當前的清除值。glclampf和glclampd(約簡的glfloat和gldouble)型別的資料被約簡到[0.0,1.0]之間,預設的深度清除值為0.0。用清除函式命令設定的清除值一直保持有效,直到它們被更改為止。
選擇了要清除的快取及其清除值後,就可以呼叫glclear()來完成清除的操作了。這個清除函式為:
void glclaear(glbitfield mask);
清除指定的快取。引數mask可以是下面這些位邏輯的或,
gl_color_buffer_bit
gl_depth_buffer_bit
gl_stencil_buffer_bit
gl_accum_buffer_bit
這些位邏輯確定所要清除的快取。注意:gl_color_buffer_bit清除rgba方式顏色快取還是清除顏色表方式顏色快取,要依賴當前系統設定的顏色方式。當清除顏色快取後,所有啟動寫操作的顏色快取都被清除。
17.2、opengl動畫
opengl提供了雙快取,可以用來製作動畫。也就是說,在顯示前台快取內容中的一幀畫面時,後台快取正在繪製下一幀畫面,當繪製完畢,則後台快取內容便在螢幕上顯示出來,而前台正好相反,又在繪製下一幀畫面內容。這樣迴圈反覆,螢幕上顯示的總是已經畫好的圖形,於是看起來所有的畫面都是連續的。
在opengl中,設計這樣的動畫程式很簡單,只需掌握乙個重點函式,即:
void auxswapbuffers(void);
設定交換快取。即執行完一次繪製過程,便交換前後臺快取,以便讓下一幀圖形在螢幕後繪製完成。當然,使用不同的視窗系統設定交換快取的函式也可能不一樣,比如在x視窗系統下,就最好用glxswapbuffers()。
此外,在視窗顯示模式中還應設定雙快取模式。下面看乙個雙快取動畫例子dbufcolr.c,這個程式是在第十三章的nmlcolr.c的基礎上改制而成的,讀者可以對比起來看看,就會發現opengl動畫程式設計其實是件極其容易和有趣的事情。
例17-1 雙快取動畫例程(dbufcolr.c)
以上程式執行結果是在螢幕上顯示乙個不斷旋轉和由小到大變化的五彩立方體。
圖17-1 雙快取動畫
OpenGL的幀快取
本文參考的是 opengl程式設計權威指南 也就是傳說中的 紅寶書 一 快取的分類 1.顏色快取 指程式設計師繪圖所用的快取,分為 左 右快取 用於立體感檢視 必須要有左快取 前 後快取 用於雙快取 必須要有前快取 4個輔助快取 可選擇的 不可顯示 程式設計師可以自己定義和使用它們 2.深度快取 用...
OpenGL中的幀快取
一 快取的分類 1.顏色快取 指程式設計師繪圖所用的快取,分為 左 右快取 用於立體感檢視 必須要有左快取 前 後快取 用於雙快取 必須要有前快取 4個輔助快取 可選擇的 不可顯示 程式設計師可以自己定義和使用它們 2.深度快取 用來儲存每個象素的深度值,也稱為z快取。3.模板快取 可以將作圖限制在...
OpenGL讀取幀快取資料
簡述有些時候我們可能需要獲取渲染後的影象資料,比較常用的函式是glreadpixels,它可以直接把視訊記憶體中的資料拷貝到記憶體中 glreadpixels讀取幀快取資料 void glreadpixels glint x,glint y,glsizei width,glsizei height,...