gl 繪製多邊形的函式解析

2021-06-21 06:43:15 字數 2690 閱讀 6055

1,所謂正反面

glfrontface(gl_ccw);  // 設定ccw方向為「正面」,ccw即counterclockwise,逆時針

glfrontface(gl_cw);   // 設定cw方向為「正面」,cw即clockwise,順時針

如果頂點標識順序與上邊設定不一致,則會認為當前的面(眼前)為該圖形的背面。

比如畫乙個三角形 vertex=

如果 glfrontface(gl_ccw); 逆時針為正面, 頂點標識indices= 才能正常顯示 ,如果indices=則圖形背面向外,顯示圖形的背面。

2. 繪製方式

glpolygonmode

簡介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_line);表示物體的前向麵用線段顯示

需要特別注意的是opengl3.1只接受gl_front_and_back作為face的值,並且不管是多邊形的正面還是背面都以相同的方式渲染。

為了更加明白以上2者(正反面和繪製方式)的直觀意義,特舉例如下:

在display()**裡加入:

glpolygonmode(gl_front, gl_fill); // 設定正面為填充模式

glpolygonmode(gl_back, gl_line);   // 設定反面為線形模式

glfrontface(gl_ccw);               // 設定逆時針方向為正面

glbegin(gl_polygon);               // 按逆時針繪製乙個正方形,在左下方

glvertex2f(-50.0f, -50.0f);

glvertex2f(0.0f, -50.0f);

glvertex2f(0.0f, 0.0f);

glvertex2f(-50.0f, 0.0f);

glend();

glbegin(gl_polygon);               // 按順時針繪製乙個正方形,在右上方

glvertex2f(0.0f, 0.0f);

glvertex2f(0.0f, 50.0f);

glvertex2f(50.0f, 50.0f);

glvertex2f(50.0f, 0.0f);

glend();

分析**:後面這個右上方的四邊形,可知其是按照順時針布置頂點的,但是我們目前設定的是以逆時針為正面,那麼執行的結果是什麼呢?答,我們看到的是其背面。而背面是

線形模式,我們看到的應該是線。  當然,左下角的應該是正面,而且是填充起來了的。

效果圖如下:

3,剔除某些面

glenable(gl_cull_face);

glcullface的引數可以是gl_front,gl_back或者gl_front_and_back,分別表示剔除正面、剔除反面、剔除正反兩面的多邊形。

對於剔除,特舉例如下:

在dispaly函式新增如下**:

glfrontface(gl_ccw);

//glcullface(gl_back);  

//glenable(gl_cull_face);

glpolygonmode(gl_front_and_back, gl_line);

glbegin(gl_quads);

。。。這裡面是畫個立方體的6個表面。逆時針。

glend(); 在有

glcullface(gl_back);  

glenable(gl_cull_face);這2句的情況下,圖形效果如下:

在沒有glcullface(gl_back);  

glenable(gl_cull_face);這2句的情況下,圖形效果如下:

4,鏤空某些面

首先,使用glenable(gl_polygon_stipple);來啟動鏤空模式(使用gldisable(gl_polygon_stipple)可以關閉之)。

然後,使用glpolygonstipple來設定鏤空的樣式。

void glpolygonstipple(const glubyte *mask);

更多參考:

第三課

Opencv繪製多邊形

利用opencv繪製多邊形,主要是因為給的資料是4個點,而繪製矩形的函式cv2.rectangle只傳遞兩個點,即左上和右下。繪製矩形框可以參考這裡 就是利用cv2.fillpoly函式 cv2.fillpoly img,area1,area2,area3 2,255,255 image表示處理的 ...

vc 使用api繪製多邊形

全域性變數 point poly1 5 poly2 5 poly3 5 hpen hpen 畫筆控制代碼 hbrush hbru 畫刷控制代碼 mypaint函式 void mypaint hdc hdc selectobject hdc,hpen selectobject hdc,hbru pol...

canvas繪製多邊形並填充

let canvas document.getelementbyid canvas canvas.width 800 畫布寬度 canvas.height 800 畫布高度 let context canvas.getcontext 2d canvasmonth context,100,100,40...