gl 繪制多邊形的函數解析 分類: OpenGL(轉)


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();
   
分析代碼:后面這個右上方的四邊形,可知其是按照順時針布置頂點的,但是我們目前設置的是以逆時針為正面,那么運行的結果是什么呢?答,我們看到的是其背面。而背面是線形模式,我們看到的應該是線。  當然,左下角的應該是正面,而且是填充起來了的。
效果圖如下:
 
 
 
 
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);
更多參考: http://www.cppblog.com/doing5552/archive/2009/01/08 第三課


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM