OpenGL入門學習筆記(三)

2021-07-27 04:43:45 字數 3383 閱讀 7213

從三維的角度來看,乙個多邊形具有兩個面。

每乙個面都可以設定不同的繪製方式:

填充;只繪製邊緣輪廓線;

只繪製頂點;

其中「填充」是預設的方式。

可以為兩個面分別設定不同的方式。

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_frontgl_backgl_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 陣列了。

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);

好的,現在請自己編輯乙個作為 mask,並用上述方法取得 mask 陣列,執行後觀察效果。

說明:繪製虛線時可以設定 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...