標籤:
OpenGL顏色函數(下)
OpenGL 顏色數組
我們也可以在頂點數組中和座標值混合一起指定情境的顏色值(參見2.17節)。這既可在RGB模式下也可在RGBA模式下進行。與頂點數組一樣,必須先啟用OpenGL的顏色數組:
glEnableClientState(GL_COLOR_ARRAY);
然後,對RGB模式要指定顏色分量的位置和格式:
glColorPointer(nColorComponents,dataType,offset,colorArray);
參數
nColorComponents賦值為3或4,依賴於是否在數組
colorArray中列出RGB或RGBA顏色分量。OpenGL符號常量如GL INT或GL FLOAT賦給參數dataType來指向顏色值的資料類型。對於一個單獨的顏色數組,我們可將0賦給參數
offset。但是如果將顏色資料和頂點資料組合在同一個數組中,則
offset的值是數組中每一組顏色分量的位元組數。
下面的程式段設定立方體前向面所有頂點的顏色為藍色,設定後向面所有頂點的顏色為紅色。
typedef GLint vertex3 [3], color3 [3];vertex3 pt [8] = {{0,0,0}, {0,1,0}, {1,0,0}, {1,1,0}, {0,0,1}, {0,1,1}, {1,0,1}, {1,1,1}};color3 hue [8] = {{1,0,0}, {1,0,0}, {0,0,1}, {0,0,1}, {1,0,0}, {1,0,0}, {0,0,1}, {0,0,1}};glEnableClientState (GL_VERTEX_ARRAY);glEnableClientState (GL_COLOR_ARRAY);glVertexPointer (3, GL_INT, 0, pt);glColorPointer (3, GL_INT, 0, hue);我們可以將顏色和頂點座標一起裝入一個交錯數組(
interlaced array )。每一個指標用適當的位移值指向單一的交錯數組。例如:
static GLint hueAndPt [] = {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1};glVertexPointer (3, GL_INT, 6 * sizeof(GLint), hueAndPt [3]);glColorPointer (3, GL_INT, 6 * sizeof(GLint), hueAndPt [0]); 該數組的前三個元素指定一個RGB顏色值,接下來的三個元素指定一個頂點座標(x, y, z),這樣交錯下去直到最後。將offset設定為相鄰顏色或頂點值之間的位元組數,即兩者均為
6 * sizeof(GLint)。顏色值從交錯數組的第一個元素即
hueAndPt[0]開始,頂點值從第四個元素即
hueAndPt[3]開始。
因為一個情境通常包括若干個對象,每個對象有多個平表面,OpenGL提供一個可以一次性指定所有頂點和顏色數組及其他類型資訊的函數。如果我們要將上例中的顏色和頂點值改為浮點數,則需按照下面的格式使用該函數:
glInterleavedArrays (GL_C3F_V3F,0,hueAndPt);
第一個參數是一個OpenGL常量,用來指定顏色(C)和頂點(V)的三元素浮點描述。而數組hueAndPt按每個頂點的顏色放在其座標前的方式交錯。該函數也自動地啟用頂點和顏色數組。在色彩索引模式下,使用下面的語句定義一個色彩索引數組:
glIndexPointer (type, stride, colorIndex);
色彩索引在數組
colorIndex中列出,而參數type和stride與g1CoIorPointer中的相同。由於顏色表索引用單個值描述,所以不需要size參數。
其他OpenGL顏色函數
這個用來為顯示視窗選擇RGB顏色分量的函數。
g1ClearColor(red, green, blue, alpha);
(red, green, blue)中的每一分量以及a參數均賦以0.0到1.0範圍中的浮點數值。四個參數的預設值都是0.0,它們產生黑色。如果每一個顏色分量置為1.0,則該淨顏色是白色。顏色分量為0.0到1.0之間的相等值時得到各種灰色。第四個參數α提供對前面顏色和使用中色彩調和的選項。這僅僅在啟用了OpenGL的調和特性後才會發生;顏色調和不可能作用於顏色表指定的值。
如同我們在3.19節中所指出,OpenGL中有幾個顏色緩衝可用做顯示情境的當前重新整理緩衝,而函數g1CIearColor指定所有顏色緩衝的顏色。然後用下面的命令將淨顏色用於這些顏色緩衝:
glClear(GL_COLOR_BUFFER_BIT);
我們也可以用glClear函數設定OpenGL中有效其他緩衝的初始值。它們是存放調和顏色資訊的累計緩衝(accumulation buffer )、存放情境對象深度值(離觀察位置的距離)的深度緩衝(depth buffer)及存放定義圖形範圍的模板緩衝(stencil buffer )。
在色彩索引模式下,使用下面的函數(而不是g1ClearColor)設定顯示視窗顏色。
glClearIndex(index);
視窗背景色用存放在顏色表中index位置的顏色來指定。執行
glClear (GL_COLOR_BUFFER_BIT)函
數後視窗就以該顏色顯示。
OpenGL庫中有另外一些顏色函數用來處理各種任務,如改變顏色模式、設定情境光照效果、描述照相機效果及繪製對象表面。我們在分析電腦圖形系統的各種處理時將檢查其他的顏色函數。但現在,我們把討論限制在與圖元的顏色描述有關的那些函數範圍內。
電腦圖形學(三)_圖元的屬性_3_OpenGL顏色函數(下)