天天看點

多邊形面的繪制

OpenGL繪制多邊形面

 計算機圖形學(http://cs.hust.edu.cn/webroot/courses/csgraphics/jiaocai.php?bookpage=5_g_c)

OpenGL繪制的多邊形面主要有三角形面、四邊形面和多邊形面。

    (1)三角形面

    三角形可能是最簡單的多邊形,它有三條邊。可以使用GL_TRIANGLES模式繪制三角形,在這種模式下,每三個頂點指定一個新三角形,如果頂點個數不是三的倍數,多餘的頂點将被忽略。程式5-1繪制了一個三角形:

程式5-1 OpenGL繪制三角形的例子

glBegin(GL_TRIANGLES);

 glVertex2f(0.0,0.0);

glVertex2f(15.0,15.0);

glVertex2f(30.0,0.0);

glEnd();

使用GL_TRIANGLE_STRIP模式可以繪制幾個相連的三角形,系統根據前三個頂點繪制第一個多邊形,以後每指定一個頂點,就與構成上一個三角形的後兩個頂點繪制新的一個三角形。使用GL_TRIANGLE_FAN模式可以繪制一組相連的三角形,這些三角形繞着一個中心點成扇形排列。第一個頂點構成扇形的中心,用前三個頂點繪制出最初的三角形之後,随後的所有頂點都和扇形中心以及緊跟在它前面的頂點構成下一個三角形,此時以順時針方向推進繪制頂點。這兩種模式繪制的三角形面如圖5-42所示。

多邊形面的繪制

(a)GL_TRIANGLE_STRIP模式   

(b)GL_TRIANGLE_FAN模式

圖5-42 三角形面繪制模式

    (2)四邊形面

    OpenGL提供了GL_QUADS和GL_QUADS_STRIP兩種模式。GL_QUADS模式中每四個頂點一組用于構造一個四邊形,如果頂點個數不是四的倍數,多餘的頂點将被忽略;而GL_QUADS_STRIP模式中,在第一對頂點之後的每對頂點,都與其前面的一對頂點一同定義一個新的四邊形。

    (3)多邊形面

    OpenGL提供的GL_POLYGON模式可以将指定的頂點順序連接配接,并将最後一個頂點自動連接配接到第一個頂點以確定多邊形是封閉的。但是,這種繪制模式并不能繪制任意多邊形,必須遵循兩條規則:第一條規則是多邊形必須是平面的,也就是說,定義多邊形的所有頂點必須位于一個平面上,不能在空間中扭曲。第二條規則是多邊形的邊緣決不能相交,而且多邊形必須是凸的。即多邊形是不自相交的多邊形,并且任意經過多邊形的直線進入和離開多邊形的次數不超過一次。

面的屬性

    (1)多邊形面的正反屬性

    與數學意義的面不同的是,圖形學中的多邊形面有正面和反面之分,該屬性由多邊形的“繞法”決定。在繪制多邊形的過程中,指定頂點的過程是有序的,即多邊形的構成路徑具有方向性,通常把指定頂點時順序和方向的組合稱為“繞法”。繞法是任何多邊形圖形的一個重要特性。一般預設情況下,OpenGL認為逆時針繞法的多邊形是正對着的,這一特性對于希望給多邊形的正面和背面賦予不同的實體特性十分有用。如果要修改OpenGL的預設行為,可以調用函數:

        glFrontFace(GL_CW);

CL_CW告訴OpenGL應該認為順時針纏繞的多邊形是正對着的。為了改回把逆時針繞法視為正面,可以使用參數CL_CCW調用glFrontFace函數。

    (2)多邊形面的顔色

    在繪制多邊形時,常常要指定繪制的顔色。而在OpenGL中,顔色實際上是對各個頂點而不是對各個多邊形指定的。多邊形的輪廓或者内部用單一的顔色或許多不同的顔色來填充的處理方式稱為明暗處理。在OpenGL中,用單一顔色處理的稱為平面明暗處理(Flat Shading),用許多不同顔色處理的稱為光滑明暗處理(Smooth Shading),也稱為Gourand 明暗處理(Gourand Shading),設定明暗處理模式的函數為:

       void glShadeModel(GLenum mode);

其中參數mode的取值為GL_FLAT或GL_SMOOTH,分别表示平面明暗處理和光滑明暗處理。應用平面明暗處理模式時,多邊形内每個點的法向一緻,且顔色也一緻,OpenGL用指定多邊形最後一個頂點時的目前顔色作為填充多邊形的純色;應用光滑明暗處理模式時,多邊形每個點的顔色需要進行插值處理,故呈現不同的顔色。

    (3)多邊形的顯示模式

    函數glPolygonMode允許把多邊形渲染為填充的實心、輪廓線或隻是點。另外,可以把這項渲染模式應用到多邊形的兩面或隻應用到正面或背面。使用下面的函數設定多邊形的顯示模式:

        glPolygonMode(Glenum face,Glenum mode);

其中,參數face指定多邊形的哪一面受模式改變的影響——GL_FRONT,GL_BACK或GL_FRONT_AND_BACK。參數mode用于指定新的繪圖模式。GL_FILL是預設值,生成填充的多邊形;GL_LINE生成多邊形的輪廓;而GL_POINT隻畫出頂點。

    (4)多邊形面的填充

    多邊形面既可以用純色填充,也可以用32×32的模闆位圖來填充。為此,需使用函數:

        void glPolygonStipple(const GLubyte *mask);

指定用于填充多邊形的模闆位圖。其中,mask是一個指向32×32位圖的指針,該位圖由0和1組成掩碼,1表示繪制多邊形對應像素,0表示不繪制。模闆位圖建立時,參數mask通常是依照從左至右,然後從下至上的順序使用單個位元組,而每個位元組都是從最高位開始使用的。

    然後,調用函數:

        glEnable(GL_POLYGON_STIPPLE);

啟用多邊形填充模式。當然,也可以用參數GL_POLYGON_STIPPLE調用glDisable函數禁用填充模式。

    (5)多邊形面的法向量

    在OpenGL中,可以為每個頂點指定法向量,如果多邊形各個頂點的法向量一緻,那麼該多邊形是平面多邊形;如果多邊形各個頂點的法向量不相同,那麼這個多邊形是一個曲面。同時,在OpenGL中不能自動計算法向量,需要由使用者顯式指定。而法向量的計算是一個幾何問題,例如多邊形的法向量可以利用不在同一條直線上的三個點構成兩個矢量的叉積确定。

    法向量可以用下面的函數指定:

        void glNormal3{bsidf} ( TYPE nx, TYPE ny, TYPE nz);

        void glNormal3{bsidf}v (const TYPE* v);

其中,該函數的非向量版本(有3個參數)中參數nx,ny,nz指定法向量的x,y和z坐标,其預設值為(0,0,1)。該函書的非向量版本(僅有1個參數)中參數v為一個包含3個元素的數組,用于指定目前法向量。指定的目前法向量将被賦予随後指定的頂點。

    由于法向量隻用于确定方向,是以其長度無關緊要,可以為任意長度。但是在光照計算時,需要使用長度為1的法向量。這裡可以使用函數:

        glEnable(GL_NORMALIZE);

啟用自動規格化法向量,使得指定的法向量長度為1。但自動規格化需要額外的計算,可能會降低應用程式的性能。

繼續閱讀