http://blog.csdn.net/zhongjling/article/details/7528091
1,所謂正反面
glFrontFace(GL_CCW); // 設置CCW方向為“正面”,CCW即CounterClockWise,逆時針
glFrontFace(GL_CW); // 設置CW方向為“正面”,CW即ClockWise,順時針
如果頂點標識順序與上邊設置不一致,則會認為當前的面(眼前)為該圖形的背面。
比如畫一個三角形 vertex={( 1,0) , ( 0,1), (-1,0)}
如果 glFrontFace(GL_CCW); 逆時針為正面, 頂點標識indices={0,1,2} 才能正常顯示 ,如果indices={2,1,0}則圖形背面向外,顯示圖形的背面。
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();
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);
//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);
然后,使用glPolygonStipple來設置鏤空的樣式。
void glPolygonStipple(const GLubyte *mask);