計算機圖形學筆記——第5章 圖元的屬性

第5章 圖元的屬性

任何影響圖元顯示方法的參數一般稱爲屬性參數(attribute parameter),例如顏色和大小等屬性參數確定了圖元的基本特性。

將屬性選擇加入圖形軟件包的一種方法是,爲每個輸出圖元函數擴充相關的參數表,從而引入合適的屬性。例如,畫線功能除了包括端點座標以外,還可以包含顏色、寬度和其他屬性的參數。另一種方法是提供一張系統當前屬性值表,並使用包含在圖形軟件包中的獨立函數來爲屬性表設置當前值。爲了生成一個輸出圖元,系統要檢測相關的屬性,並使用當前屬性設置來調用該顯示程序。有些圖形軟件包使用兩種屬性值設定方法的組合,而OpenGL等其他圖形庫則使用更新系統屬性表的獨立函數來設定屬性。

維護屬性和其他參數當前值表的圖形系統稱爲狀態系統(state system)狀態機(state machine)。輸出圖元的屬性和當前幀緩存位置等其他參數稱爲狀態變量(state variable)狀態參數(state parameter)。在給一個或幾個狀態參數賦值時,系統進入一個特定狀態。該狀態一直保留到狀態參數的值再次改變。

5.1 OpenGL狀態變量

屬性值和其他參數設置由定義當前OpenGL狀態的獨立函數指定。OpenGL中的狀態變量有顏色和其他圖元屬性、當前矩陣模式、模型觀察矩陣的元素、緩存當前位置和場景光照效果參數等。所有OpenGL參數都有默認值,它們在被指定新值前保持不變並發揮作用。任何時候我們都可以查詢系統狀態參數的當前值。

5.2 顏色和灰度

5.2.1 RGB顏色分量

在彩色光柵系統中,可以選用的顏色數量依賴於幀緩存中提供的存儲容量。顏色信息可以用兩種方式存儲在幀緩存中:直接在幀緩存中存儲紅色、綠色和藍色(RGB)編碼,或將顏色碼存入一個獨立的表中並在像素位置存儲指向顏色表表項的索引

3位緩存中存儲的顏色值
顏色碼 紅色 綠色 藍色 顯示顏色
0 0 0 0 黑色
1 0 0 1 藍色
2 0 1 0 綠色
3 0 1 1 青色
4 1 0 0 紅色
5 1 0 1 黑色
6 1 1 0 品紅
7 1 1 1 白色

2.2 顏色表

在顏色查找表(color lookup table)或顏色表(color map)中存儲顏色值的一種可能方案。有時顏色表還稱爲視頻查找表(video lookup table)。這時幀緩存中的值用做指向顏色表的索引。

例如,每一像素可引用256個表位置中的任意一個,而每一表項使用24位來指定一個RGB顏色。十六進制顏色碼0x0821使像素位置xy(x,y)處顯示綠藍混合色。使用這種特殊的查找表的系統讓用戶可從近1700萬種顏色中任選256種顏色同時顯示。與全綵色系統相比,這種方案減少了可同時顯示的顏色量,但也使幀緩存容量減少到只要1MB。處理反走樣等特殊的繪製應用及有多個輸出設備時,有時需要多個顏色表。

2.3 灰度

由於計算機圖形系統都具有彩色功能,我們可以在應用程序中使用RGB顏色函數來設定灰色程度或灰度(gray scale)。當RGB函數中指定相同量的紅色、綠色和藍色時,結果是某種程度的灰色。靠近0的值生成暗灰色,而靠近1的值生成亮灰色。灰度顯示方法的應用包括增強黑白照片和產生可視化效果。

2.4 其他顏色參數

除了RGB顏色描述,計算機圖形應用還使用一些其他的三分量顏色描述。例如,打印機輸出顏色用青色、品紅和黃色三分量來描述,而顏色的界面有時用亮和暗來選擇顏色。通常意義下的顏色和光是一種複雜現象,在光學、輻射度和心理學中提出了許多術語及概念,用來描述光源和光照效果的各個方面。在物理上,一種顏色可以描述爲有一定頻率範圍和能量分佈的電磁輻射,但也涉及我們對顏色的感覺。因此,我們使用物理術語強度(intensity)來量化一個時間段中在特定方向的光能輻射,而用心理學術語亮度(luminance)來描述感覺光亮的特徵。

3. OpenGL顏色函數

顏色顯示模型(color display mode)設定爲RGB

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB)

變量表中的第一個常量指示正在使用單個幀緩存,第二個常量設定RGB模式,即默認模型。如果要用指向顏色表的索引來指定顏色,則用OpenGL常量GLUT_INDEX取代GLUT_RGB。在需要爲圖元指定一組特殊的顏色值時,將OpenGL定義成這種顏色狀態。

3.1 OpenGL的RGB和RGBA顏色模型

可以在調用函數glutInitDisplayMode時使用OpenGL常量GLUT_RGBA來選擇這個模式,顏色調和是一個重要應用的模擬透明效果。

在RGB(或RGBA)模式中,使用下面的函數來選擇當前顏色分量:

g1Color*(colorComponents)

使用3或4及數值的數據類型碼和一個任選的向量後綴一起指定RGB或RGBA模式。該數值數據類型是b(字節)、i(整數)、s(短整數)、f(浮點數)和d(雙精度浮點數)及無符號數值。顏色分量的浮點數範圍從0.0到1.0,g1Color包括α\alpha值的默認顏色分量是(1.0,1.0,1.0,1.0),它將RGB顏色設成白色而α\alpha值爲1.0。如果我們使用RGB描述(即使用g1Color3代替g1color4),則α\alpha分量自動地設成1.0,表示不需要顏色調和。

g1Color3f (0.0, 1.0, 1.0);

如果要使用數組指定三個顏色分量,則可按如下方式設定這個例子中的顏色:

g1Color3fv(colorArray):

在OpenGL的內部,顏色信息用浮點數表示。我們也可以用整數來描述顏色,但它們被自動地轉換成浮點數。該轉換依賴於我們選擇的數據類型和該類型數據能描述的範圍。

例如, 無符號字節型數值(後綴碼爲ub)的範圍從0到255,對應於某些窗口系統中使用的顏色描述。我們可以在前面的例子中這樣來指定青色:

g1Color3ub(0, 255, 255)

如果用無符號32位整數(後綴碼爲ui),範圍是042949672950\sim 4294967295

3.2 OpenGL顏色索引模式

OpenGL中也可以使用指向顏色表的顏色索引模式(color-index mode) 來指定顏色。在該模式下,通過指定一個指向顏色表的索引來設定當前顏色:

g1Index*(colorIndex):

在OpenGL基本庫中沒有裝載顏色查找表的函數,因爲表處理子程序是窗口系統的一部分。有的窗口系統支持多個顏色表,而另外一些則僅有一個顏色表及有限的選擇。然而,有一個GLUT子程序可用來與窗口系統進行交互,從而爲給定的一個索引位置指定顏色如下:

glutSetColor(index, red, green , blue);

OpenGL核心庫擴充了處理另外三個顏色表的子程序。它們是OpenGL成像子集(Imaging Subset)的一個部分。存在這些表中的顏色值可通過各個緩存處理來修改像素值。使用這些表的例子有設定照相機的聚焦效果、從圖像中過濾掉某些顏色、增強某種強度或調整亮度、將灰度照片轉換成彩色及顯示的反走樣等。可以利用這些表來改變顏色模型,即將RGB顏色改變爲使用另外三個“基色”(如青色、品紅和黃色)的顏色描述。

OpenGL成像子集中使用GL_COLOR_TABLEGL_POST_CONVOLUTION_COLOR_TABLEGL_POST_COLOR_MATRIX_COLOR_TABLE名字的特定顏色表由g1Enable函數來激活。

3.3 OpenGL顏色調和

在許多應用中,很容易混合重疊對象的顏色或將一個對象與背景調和。這樣的例子有模擬畫筆效果、將兩張或多張照片混合成一張、透明效果建模和場景中對象的反走樣。許多圖形軟件包提供生成多種顏色調和效果的方法,這些函數稱爲顏色調和函數(color-blending function)圖像混合函數(image-compositing function)。在OpenGL中,通過先將第一個對象裝載進幀緩存,再將第二個對象的顏色與幀緩存顏色相混合來實現兩個對象顏色的調和。當前幀緩存顏色稱爲OpenGL目標顏色(destination color),而第二個對象的顏色稱爲OpenGL源顏色(source color)。調和方法僅在RGB或RGBA模式下完成。要在應用中進行顏色調和,必須先用下面的函數激活這個OpenGL特性:

g1Enable(GL_BLEND)

使用下面的函數將關閉OpenGL的顏色調和子程序:

g1Disable (GL_BLEND)

如果顏色調和沒有被激活,則一個對象的顏色將簡單地取代幀緩存中相應位置的內容。

將要裝入幀緩存的新的調和顏色計算如下:
(SrRs+DrRd,SgGs+DgGd,SbBs+DbBd,SαAs+DαAd) (S_rR_s + D_rR_d, S_gG_s+D_gG_d, S_bB_s+D_bB_d, S_\alpha A_s + D_\alpha A_d)
其中,RGBA源顏色分量爲(Rs,Gs,Bs,As)(R_s,G_s,B_s,A_s) ,目標顏色分量爲(RdGdBdAd)(R_d,G_d,B_d,A_d),源調和因子爲(Sr,Sg,Sb,Sα)(S_r,S_g,S_b,S_\alpha),而目標調和因子爲(Dr,Dg,Db,Dα)(D_r,D_g,D_b,D_\alpha)。計算出的組合顏色分量歸一到0.0到1.0之間。即任何大於1.0的總和均設爲1.0,而任何小於0.0的總和設爲0.0。

使用下列函數可選擇調和因子的值:

g1BlendFunc(sFactor,dFactor)

參數sFactor和dFactor,即源和目標因子,都用OpenGL符號常量賦值以指定爲預定義的一組四元素調和係數。例如,常量GL_ZERO表示調和因子(0.0, 0.0, 0.0, 0.0),而GL_ONE表示(1.0, 1.0, 1.0, 1.0)。

使用GL_DST_ALPHAGL_SRC_ALPHA將四個調和因子設爲α\alpha。其他可用來設定調和因子的OpenGL常量有GL_ONE_MINUS_DST_ALPHAGL_ONE_MINUS_SRC_ALPHAGL_DST_COLORGL_SRC_COLOR。調和因子的作用是模擬透明性。

sFactor的默認值是GL_ONE,而dFactor的默認值是GL_ZERO。因此,這兩組調和因子的默認值將導致新來的顏色值取代幀緩存中的當前顏色值。

3.4 OpenGL顏色數組

必須先激活OpenGL數組

g1EnableClientState (GL_COLOR_ARRAY)

然後,對RGB模式要指定顏色分量的位置和格式:

g1ColorPointer (nColorComponents, dataType , offset, colorArray):

參數nColorcomponents賦值爲3或4,取決於是否在數組colorArray中列出RGB或RGBA顏色分量。OpenGL符號常量如GL_INT或GL_FLOAT賦給參數datarype來指向顏色值的數據類型。對於一個單獨的顏色數組,我們可將0賦給參數offset。但是如果將顏色數據和頂點數據組合在同一個數組中,則offset的值是數組中每一組顏色分量的字節數。

我們可以將顏色和頂點座標一起裝入一個交錯數組(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]; 
g1VertexPointer (3. GL_INT.6* sizeof(GLint). hueAndPt[3]);
g1ColorPointer (3. GL_INT,6* sizeof(GLint), hueAndPt[0]);

因爲一個場景通常包括若干個對象,每個對象有多個平表面,OpenGL提供一個可以一次性指定所有頂點和顏色數組及其他類型信息的函數。如果我們要將上例中的顏色和頂點值改爲浮點數,則需按照下面的格式使用該函數:

glInterleavedArrays (GL_C3F_V3F,0,hueAndPt)

第一個參數是一個OpenGL常量,用來指定顏色(C)和頂點(V)的三元素浮點描述。而數組hueAndPt按每個頂點的顏色放在其座標前的方式交錯。該函數也自動地激活頂點和顏色數組。

3.5 其他OpenGL顏色函數

OpenGL中有幾個顏色緩存可用做顯示場景的當前刷新緩存,而函數g1Clearcolor 指定所有顏色緩存的顏色。然後用下面的命令將淨顏色用於這些顏色緩存:

g1Clear(GL_COLOR_BUFEER_BIT)

我們也可以用g1Clear函數設定OpenGL中有效的其他緩存的初始值。它們是存放調和顏色信息的累積緩存(accumulation buffer)、存放場景對象深度值(離觀察位置的距離)的深度緩存(depth buffer)及存放定義圖形範圍的模板緩存(stencil buffer)。

在顏色索引模式下,使用下面的函數(而不是g1Clearcolor)設定顯示窗口的顏色:

g1ClearIndex (index)

窗口背景色用存放在顏色表中index位置的顏色來指定。執行g1Clear(GL_COLOR_BUFFER_BIT)函數後窗口就以該顏色顯示。

4. 點的屬性

一般情況下,我們可以設定點的兩個屬性:顏色和大小。

5. OpenGL點屬性函數

指定點位置的顯示顏色由狀態表中的當前顏色值控制。而該顏色用g1Color函數或g1Index函數來指定。

我們使用下面的函數來指定OpenGL中點的大小:

g1PointSize(size)

該點以像素方塊的形式顯示。參數size用正浮點數值指定,該值舍入到一個整數(除非該點經反走樣處理)。顯示該點的水平和垂直像素數由參數size決定。

屬性函數可以出現在g1Begin/g1End函數對之內或之外。例如,下列程序段繪製三個不同顏色和大小的點。第一個是標準大小的紅色點,第二個是雙倍尺寸的綠色點,而第三個是三倍尺寸的藍色點:

g1Color3f(1.0,0.0,0.0); 
g1Begin (GL_POINTS); 
	g1Vertex2i(50.100);
	g1PointSize (2.0);
	g1Color3f (0.0,1.0,0.0);
	g1Vertex2i(75.150);
	g1PointSize (3.0);
	g1Color3f (0.0.0.0,1.0);
	g1Vertex2i(100,200);
g1End();

6. 線的屬性

直線段可以使用三個基本屬性來顯示:顏色、線寬和線型。線的顏色使用對所有圖元相同的函數進行設定,而線寬和線型則使用單獨的線函數選擇。另外,線還可以生成如畫筆和筆刷等其他效果。

6.1 線寬

線寬選擇的實現取決於輸出設備的能力。在視頻監視器上的粗線可以用相鄰的平行線進行顯示,而在筆式繪圖儀上則可能需要更換畫筆來繪製粗線。

在光柵實現中,類似於Bresenham算法,通過在每個取樣位置處使用一個像素來生成標準線寬。其他線寬則是作爲標準線寬的正整數倍,通過沿相鄰平行線路徑繪製額外的像素而顯示。

6.2 線型

可以選用的線型屬性有實線、虛線和點線等。許多圖形系統都允許選擇劃線長度和劃線間隔的長度。

6.3 畫筆或畫刷的選擇

7. OpenGL線屬性函數

7.1 OpenGL線寬函數

用下面的OpenGL函數可設定線寬:

glLineWidth(width):

參數width賦以實數,該值舍入到最近的非負整數。如果輸入值舍入到0.0,則線段用默認的標準寬度1.0顯示。然而,在對線段進行反走樣時,其邊界進行光滑處理以減少階梯現象,因而有可能出現小數寬度。有些線寬函數的實現僅支持有限的幾種線寬,其他一些則不支持1.0以外的線寬。

7.2 OpenGL線型函數

默認狀態下,直線段顯示成實線。但也可以顯示劃線、點線或短劃和點混合的線段。還可以改變短劃及短劃或點之間的長度。可以利用下面的OpenGL函數設定當前線型:

glLineStipple(repeatFactor,pattern)

參數pattern用來引入描述如何顯示線段的一個16位整數。值爲1的位對應一個“開”像素,值爲0的位對應一個“關”像素。該模式從低位開始應用於線路徑。默認模式爲OxFFFF(每一位的值均爲1),它生成實線。整數參數repeatFactor說明模式中每一位重複應用多少次才輪到下一位。默認的重複值是1。

作爲指定一個線型的例子,假定參數pattern賦予了十六進制數0x00FF而重複因子爲1。這將顯示一條由8像素短劃和8像素短劃間隔的劃線。同樣,由於先應用低位值,線段從始端開始先顯示一個8像素短劃。接着是一個8像素間隔,然後再顯示一個8像素短劃,如此直到第二個端點。

在使用當前線型顯示線段之前,必須先激活OpenGL的線型特性。下面的函數可實現這一點:

g1Enable(GL_LINE_STIPPLE):

7.3 其他OpenGL線效果

除了指定線寬、線型和實心顏色之外,還可以使用顏色漸變來顯示線段。

g1ShadeMode1(GL_SMOOTH); 
g1Begin (GL_LINES);
	g1Color3f (0,0,0.0,1.0);
	g1Vertex2i(50,50);
	g1Color3f(1.0,0.0.0.0);
	g1Vertex2i(250.250): 
g1End():

通過將藍色賦給線段的一個端點而將紅色賦給另一端點來展示這一點。線段按兩端點顏色的線性插值方式進行顯示。

函數g1shadeMode1可以有另一個變量GL_FLAT。在這種情況下,線段用單一顏色即第二個點(250,250)的顏色來顯示,即顯示一條紅色線段。實際上,GL_SMOOTH是默認值,因此,即使未使用該函數也會顯示一條均勻顏色插值的線段。

8. 曲線屬性

曲線屬性的參數與線段相同,可以使用各種顏色、寬度、點劃線模式和有效的畫筆和筆刷選擇來顯示曲線。採用畫曲線算法來實現屬性選擇,這一點類似於畫直線。

嚴格地說,OpenGL並不把曲線作爲和點及線段一樣的圖元來考慮。在OpenGL中可使用幾種方法來顯示曲線。最簡單的方法可能是使用一組短線段逼近曲線,另外,曲線段可以用樣條(spline)來畫。這可以使用OpenGL的evaluator 函數來繪製,或者使用OpenGL實用函數(GLU)庫中畫樣條的函數來繪製。

9. 填充區屬性

多數圖形軟件包將填充區限定爲多邊形,因爲它們用線性方程來描述。更進一步的限制是要求填充區是一個凸多邊形,因此掃描線不會與兩條以上的邊相交。然而,我們一般可以填充任意指定的區域,包括圓、橢圓和其他有曲線邊界的對象。而像繪畫程序等應用系統則提供針對任意形狀區域的填充功能。

9.1 填充模式

一般的圖形軟件包提供的基本填充屬性是內部的顯示模式。我們可以將一區域顯示爲單一顏色、指定填充圖案或只給出邊界的“空心”模式。

在這裏插入圖片描述
有些圖形系統提供對覆蓋掩模的初始位置的選擇。從該初始位置開始,掩模在水平和垂直方向反覆填充直到所有顯示區域都填滿了無重疊的掩模。在使用圖案覆蓋的填充區,矩陣掩模指出哪些像素應該使用特定顏色顯示。這種用矩形圖案填充一個區域的處理稱爲平鋪(tiling),而矩形填充圖有時稱爲平鋪圖案(tiling patem)。
在這裏插入圖片描述

9.2 顏色調和填充區域

也可以按照多種方式將填充圖案和背景顏色混合。圖案和背景色混合時使用透明因子來確定背景中有多少應該混合到對象顏色中。 某些使用調和顏色的填充方法稱爲軟填充(soft-fill)或色彩填充(tint-fill)算法。這些填充方法的一種作用是,減弱在已經模糊的對象邊界上的填充顏色,從而實現對邊的反走樣。

10. OpenGL填充區屬性函數

OpenGL中僅提供對凸多邊形的填充區子程序。顯示一個填充凸多邊形要經過下面四個步驟:

  1. 定義一個填充圖案。
  2. 引用多邊形填充子程序。
  3. 激活OpenGL多邊形填充特性。
  4. 描述要填充的多邊形。

多邊形填充圖案一直顯示到包括多邊形的邊。因此,填充區中沒有邊界線,除非特別指定要顯示邊界線。

10.1 OpenGL填充圖案函數

默認時,凸多邊形使用當前顏色設定顯示成一個實心顏色區域。爲了用OpenGL的圖案填充一個多邊形,我們使用32×3232\times 32的位掩模。掩模中值爲1表示對應像素設爲當前顏色,值爲0表示對應的幀緩存位置的值不變。填充圖案使用OpenGL數據類型GLubyte以無符號字節進行描述,如同在g1Bitmap函數中一樣。

一旦建立了一個掩模,可以使用下列函數將其用做當前填充圖案:

g1PolygonStipple(fillPattern)

接下來,在指定要使用當前圖案填充的多邊形頂點之前必須激活填充子程序。這使用下列語句來實現:

g1Enable(GL POLYGON_STIPPLE)

類似地,使用下列語句關掉圖案填充:

glDisab1e(GL_POLYGON_STIPPLE)

在這裏插入圖片描述

在這裏插入圖片描述

10.2 OpenGL紋理和插值圖案

這將生成仿真木材、磚、拉絲鋼(brushed steel)或某些其他材料外貌的圖案。也可以仿照線圖元中的做法得到多邊形內部的插值顏色。爲此,我們對多邊形的頂點賦以不同顏色。插值填充用來爲各種光照條件下的着色表面生成真實感顯示。

作爲插值填充的例子,下面的程序段將藍色、紅色和綠色分別賦給一個三角形的三個頂點。多邊形填充就是在三個頂點間的顏色插值:

glShadeMode1(GL_SMOOTH); 
g1Begin (GL_TRIANGLES); 
	g1Color3f (0.0.0.0.1.0);
	g1Vertex2i(50.50); 
	g1Color3f(1.0,0.0,0.0); 
	g1Vertex2i(150,50); 
	g1Color3f (0.0,1.0.0.0); 
	g1Vertex2i (75,150); 
g1End();

當然,如果爲三角形整體設定一個單色,則用一種顏色來填充多邊形。而如果將g1ShadeMode1函數中的變量改變爲GL_FLAT,則多邊形用最後指定的顏色(綠色)來填充。值GL_SMOOTH是着色的默認值,但包含這一描述可提醒我們多邊形將用頂點插值法填充。

10.3 OpenGL線框圖方法

我們也可以僅顯示多邊形的邊,來生成線框圖或多邊形的空心顯示。還可以通過顯示一組頂點來顯示多邊形。這些選項通過下面的函數來選定

g1PolygonMode(face, displayMode)

參數face用來指定在多邊形的哪一個面上僅顯示邊或頂點。它賦以GL_FRONT、GL_BACK或GL_FRONT_AND_BACK。

如果選擇僅顯示多邊形的邊,就將GL_LINE賦給參數display-Mode。如果僅繪出多邊形頂點,則將GL_POINT賦給參數displaywode。第三個選項是GL_FILL。但這是默認的顯示模式,所以我們通常僅在需要設定多邊形邊或頂點屬性時引用g1PolygonMode。

顯示多邊形的選項是在填充內部的同時使用不同的顏色或圖案來顯示它的邊或頂點。這可以通過指定該多邊形兩次來實現:先將displayMode設定爲GL_FILL然後再設定爲GL_LINE(或GL_POINVT)。

用綠色填充多邊形內部,而用紅色顯示邊

g1Color3f (0.0,1.0,0.0);
g1Color3f(1.0,0.0.0.0): 
g1PolygonMode (GL_FRONT, GL_LINE);

顯示填充多邊形邊的方式可能在邊之間生成縫隙,這種稱爲**縫線(stiching)**的效果由掃描線填充算法和邊的畫線算法的計算差別造成。在對一個三維多邊形進行填充時,深度值(離xy平面的距離)按每一(x,y)位置計算。但是在多邊形一條邊上的這個深度值通常與在同一(x,y)位置用畫線算法計算所得的深度值不完全相同。因此在講行可見性測試時,內部填充色可用來代替邊的顏色以顯示沿多邊形邊界的點。

消除三維多邊形顯示邊縫隙的一個辦法是移動由填充子程序計算的深度值,使他們與多邊形的邊深度值不重疊。

g1Enable(GL_POLYGON_OFFSET_FILL);
g1PolygonOffset (factor1. factor2);

第一個函數激活掃描線填充的位移子程序,而第二個函數用來設定一對計算深度位移總量的浮點值factor1和factor2。這一深度位移的計算是
depthOffset=factor1×maxSlope+factor2×const depthOffset = factor1 \times maxSlope + factor2\times const
maxslope是多邊形的最大斜率,const是實現常數。

另一種消除多邊形邊上縫線效果的方法是使用OpenGL的模板緩存來限制多邊形內部填充,從而估它和邊不重疊。但這種方法較爲複雜且一般較慢,因而多數使用深度位移方法。

10.4 OpenGL前向面函數

儘管默認情況下由多邊形頂點的次序來控制前向面和後向面的確認,我們還是可以使用下列函數單獨地指定一個場景中的前向面和後向面:

g1FrontFace(vertexorder)

如果設定參數vertexOrder的值爲OpenGL常量GL_CW,則隨後定義的順時針多邊形可看做前向面。該OpenGL特性用來交換以順時針次序指定頂點的多邊形的面。常量GL_CCW標識多邊形頂點的逆時針次序爲前向面朝向,即默認次序。

11. 字符屬性

顯示的字符外觀由字體、大小、顏色和方向這些屬性控制。在許多軟件包中,既可對整個字符串(文本)設置屬性,也可對諸如繪製數值圖等特殊應用中的單個字符設置屬性。

在這裏插入圖片描述
字符串的方向按字符向上向量(character up vector) 設定。

12. OpenGL字符屬性函數

使用OpenGL軟件包顯示字符有兩種方法。使用核心庫中的位圖函數來設計字體集,或引用OpenCL.字符生成函數。GLUT庫中包含顯示預定義點陣和筆劃字符集的函數。因此,可以設定的字符屬性是那些能應用於位圖或線段的屬性。

對點陣或輪廓字體,顯示顏色由當前顏色狀態來確定。一般而言,字符的間隔和大小由子符描述確定,如 GLUT_BITMAP_9_BY_15和``GLUT_STROKE_MONOROMAN`。但也可以爲輪廓字體設定線寬和線型。我們用g1Linewidth函數指定寬度,用g1Linestipp1e函數選擇線型。然後GLUT筆劃字體用指定的當前線寬和線型屬性值來顯示。

13. OpenGL反走樣函數

取樣過程將物體上的座標點數字化爲離散的整數像素位置,因此光柵算法生成的圖元顯示具有鋸齒形或階梯狀外觀。這種由於低頻取樣(不充分取樣)而造成的信息失真稱爲走樣(aliasing)。可以使用校正不充分取樣過程的反走樣(antialiasing) 方法來改善所顯示的光柵線的外觀。

OpenGL提供三類圖元支持反走樣。使用下列函數可激活OpenGL的反走樣子程序:

g1Enab1e(primitiveType)

其中參數 primitiveType被賦以符號常量GL_POINT_SMOOTHGL_LINE_SMOOTHGL_POLYGON_SMOOTH。假定我們用RGBA模式指定顏色,則同樣需要激活OpenGL顏色調和操作:

glEnab1e(GL_BLEND)

14. OpenGL詢問函數

使用OpenGL查詢函數(query function)可以獲得包括屬性設定在內的任意狀態參數的當前值。這些函數將指定狀態值複製到一個數組中,以便存儲起來在以後使用或檢查當前的系統狀態是否有錯誤。

要查詢當前屬性值,需要使用一個合適的“g1Get”函數:

g1GetBooleanv()
g1GetFloatv()
g1GetIntegerv()
g1GetDoublev()

在其中的每一個函數中,我們指定兩個變量。第一個變量是標識一個屬性或狀態參數的OpenGL符號常量。第二個變量是一個指針,指向由函數名指出的數據類型的一個數組。

g1GetFloatv (GL_CURRENT_COLOR,colorValues):

當前顏色分量被傳遞給數組colorValues。要獲取整數的當前顏色分量,必須引用g1GetIntegerv函數。有些情況下,必須在返回指定數據類型時進行類型轉換。

可以將GL_POINT_SIZEGL_LINE_WIDTHGL_CURRENT_RASTER_POSITION等其他一些OpenGL常量應用於這些函數來獲取相應的當前狀態值。常量GL_POINT_SIZE_RANGEGL_LINE_WIDTH_RANGE可以用來支持對點的大小和線的寬度的檢查。

15. OpenGL屬性組

屬性和其他狀態參數按屬性組(attribute group) 進行組織。每一組包括相關的狀態參數集合。例如,點屬性組(point-attribute group)包括了大小和點的平滑(反走樣)參數,而線屬性組(line-attribute group) 包括了寬度、模板狀態、模板圖案、模板重複計數及線段光滑狀態等。類似地,多邊形屬性組(polygon-atribute group) 包括了11種多邊形參數,如填充模式、前向面標誌及多邊形平滑狀態。因爲顏色是所有圖元所共有的一個屬性,所以它有單獨的屬性組。而有些參數被包含在多個組內。

保存一個指定屬性組所有參數的工作由下列命令實現:

g1PushAttrib(attrGroup)

參數attrGroup用標識一個屬性組的OpenGL符號常量來賦值,如GL_POINT_BITGL_LINE BITGL_POLYGON_BIT。爲了保存顏色參數,使用符號常量GL_CURRENT_BIT。我們可以用符號常量GLALL_ATTRIB_BITS來存儲所有屬性組中的所有狀態參數。g1pushattrib函數將指定組的所有參數放進屬性棧(attribute stack)。

利用邏輯OR操作,可以組合符號常量,從而將參數存儲在兩個或更多的組中。下面的語句給出了屬性棧上用於點、直線和多邊形的參數:

g1PushAttrib(GL_POINT_BIT I GL_LINE_BIT I GL_POLYGON_BIT)

將一組狀態參數存儲起來後,我們可以用下列函數將屬性棧的所有值進行重建:

g1PopAttrib()

g1PopAttrib函數中不使用任何變量,因爲它使用棧中的所有值來設定OpenGL的當前狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章