從三維的角度來看,乙個多邊形具有兩個面。
每乙個面都可以設定不同的繪製方式:
填充;只繪製邊緣輪廓線;
只繪製頂點;
其中「填充」是預設的方式。
可以為兩個面分別設定不同的方式。
glpolygonmode的原型是:void glpolygonmode(glenum face,glenum mode);
用於控制多邊形的顯示方法。
face將確定顯示模式將適用於物體的哪些部分,控制多邊形的正面和背面的繪圖模式:
引數含義
gl_front
顯示模式將適用於物體的前向面(也就是物體能看到的面)
gl_back
顯示模式將適用於物體的後向面(也就是物體上不能看到的面)
gl_front_and_back
顯示模式將適用於物體的所有面
mode這個引數確定選中的物體的面以何種方式顯示(顯示模式):
引數含義
gl_point
顯示頂點,多邊形用點顯示
gl_line
顯示線段,多邊形用輪廓顯示
gl_fill
顯示面,多邊形採用填充形式
正面glpolygonmode(gl_front, gl_fill); // 設定正面為填充方式
glpolygonmode(gl_back, gl_line); // 設定反面為邊緣繪製方式
glpolygonmode(gl_front_and_back, gl_point); // 設定兩面均為頂點繪製方式
按照約定,如果多邊形的頂點以逆時針順序出現在螢幕上,它便稱為「正面」。
但也有一些表面比較特殊。例如「麥比烏斯帶」(請自己 google 一下),可以全部使用「正面」或全部使用「背面」來表示。
glfrontface
glfrontface
是opengl的初級命令,有兩個基本作用,一是可以用來用在某些特殊場合(比如剔除麵片),二是可以提高渲染效率。
函式原型:
void glfrontface(glenum mode);
作用是控制多邊形的正面是如何決定的。在預設情況下,mode是gl_ccw。
mode的值為:
引數含義
gl_ccw
表示視窗座標上投影多邊形的頂點順序為逆時針方向的表面為正面。
gl_cw
表示頂點順序為順時針方向的表面為正面。
頂點的方向又稱為環繞。
例項
在三維空間中,乙個多邊形雖然有兩個面,但我們無法看見背面的那些多邊形,而一些多邊形雖然是正面的,但被其他多邊形所遮擋。如果將無法看見的多邊形和可見的多邊形同等對待,無疑會降低我們處理圖形的效率。在這種時候,可以將不必要的面剔除。void mydisplay(void)
使用glenable(gl_cull_face);
來啟動剔除功能(使gldisable(gl_cull_face);
可以關閉之)然後,使用glcullface
來進行剔除。
glcullface()
引數包括gl_front
和gl_back
和gl_front_and_back
.
意義:前兩個引數分別表示禁用多邊形正面或者背面上的光照、陰影和顏色計算及操作,消除不必要的渲染計算,最後乙個引數使用後,所有的多邊形都將被剔除,所以看見的就只有點和直線。
glenable(gl_polygon_stipple);
來啟動鏤空模式(使用gldisable(gl_polygon_stipple);
可以關閉之)。
然後,使用glpolygonstipple ()
來設定鏤空的樣式。
void glpolygonstipple(const glubyte *mask);
其中的引數 mask 指向乙個長度為 128 位元組的空間,它表示了乙個 32*32 的矩形應該如何鏤空。其中:第一
個位元組表示了最左下方的從左到右(也可以是從右到左,這個可以修改)8 個畫素是否鏤空(1 表示不鏤空,
顯示該畫素;0 表示鏤空,顯示其後面的顏色),最後乙個位元組表示了最右上方的 8 個畫素是否鏤空。
但是,如果我們直接定義這個 mask 陣列,像這樣:
這樣一堆資料非常缺乏直觀性,我們需要很費勁的去分析,才會發現它表示的竟然是乙隻蒼蠅。static glubyte mask[128] =
;
如果將這樣的資料儲存成,並用專門的工具進行編輯,顯然會方便很多。下面介紹如何做到這一點。
首先,用 windows 自帶的畫筆程式新建一副,取名為 mask.bmp,注意儲存時,應該選擇「單色位圖」。
在「圖象」->「屬性」對話方塊中,設定的高度和寬度均為 32。
用放大鏡觀察,並編輯之。黑色對應二進位制零(鏤空),白色對應二進位制一(不鏤空),編輯完畢後保
存。 然後,就可以使用以下**來獲得這個 mask 陣列了。
好的,現在請自己編輯乙個作為 mask,並用上述方法取得 mask 陣列,執行後觀察效果。static glubyte mask[128];
file *fp;
fp = fopen("mask.bmp", "rb");
if( !fp )
exit(0);
// 移動檔案指標到這個位置,使得再讀 sizeof(mask)個位元組就會遇到檔案結束
// 注意-(int)sizeof(mask)雖然不是什麼好的寫法,但這裡它確實是正確有效的
// 如果直接寫-sizeof(mask)的話,因為 sizeof 取得的是乙個無符號數,取負號會有問題
if( fseek(fp, -(int)sizeof(mask), seek_end) )
exit(0);
// 讀取 sizeof(mask)個位元組到mask
if( !fread(mask, sizeof(mask), 1, fp) )
exit(0);
fclose(fp);
說明:繪製虛線時可以設定 factor 因子,但多邊形的鏤空無法設定 factor 因子。請用滑鼠改變視窗的大小,
觀察鏤空效果的變化情況。
OpenGL入門學習(三)
在第二課中,我們學習了如何繪製幾何圖形,但大家如果多寫幾個程式,就會發現其實還是有些鬱悶之處。例如 點太小,難以看清楚 直線也太細,不舒服 或者想畫虛線,但不知道方法只能用許多短直線,甚至用點組合而成。這些問題將在本課中被解決。下面就點 直線 多邊形分別討論。1 關於點 點的大小預設為1個畫素,但也...
OpenGL入門學習 三
出處 在第二課中,我們學習了如何繪製幾何圖形,但大家如果多寫幾個程式,就會發現其實還是有些鬱悶之處。例如 點太小,難以看清楚 直線也太細,不舒服 或者想畫虛線,但不知道方法只能用許多短直線,甚至用點組合而成。這些問題將在本課中被解決。下面就點 直線 多邊形分別討論。1 關於點 點的大小預設為1個畫素...
OpenGL入門學習筆記02
多邊形 1,多邊形的兩面和繪製 這是乙個三維的概念,乙個多邊形有正面和反面,我們可以設定正面和反面的繪製方式 glpolygonmode gl front,gl point 正面,只繪製頂點 gl back 反面gl front and back正面和反面 gl fill填充的繪製方式gl line...