1. 程式人生 > >零基礎學習OpenGL(六)--面剔除

零基礎學習OpenGL(六)--面剔除

      一個3D的圖形,我們從任意方向同時可以看到的面數是少於圖形的總面數的,如果看不到的面不執行著色,效率會大大提高。OpenGL能夠檢查所有面向觀察者的面,並渲染它們,而丟棄那些背向的面,節省我們很多的片段著色器呼叫。OpenGL區分哪些是正向面哪些是背向面的方法是:分析頂點資料的環繞順序。

       當定義一組三角形頂點時,可以選擇順時針,也可以選擇逆時針:

          float vertices[] = {

               // 順時針

               vertices[0], // 頂點1

               vertices[1], // 頂點2

               vertices[2], // 頂點3

                // 逆時針

                vertices[0], // 頂點1

                 vertices[2], // 頂點3

                 vertices[1] // 頂點2

           };

       OpenGL在渲染圖元的時候將使用這個資訊來決定一個三角形是一個正向三角形還是背向三角形。預設情況下,逆時針頂點所定義的三角形將會被處理為正向三角形。

        如下圖:在頂點資料中,我們定義的是兩個逆時針順序的三角形。然而,從觀察者的方面看,後面的三角形是順時針的,如果我們仍以1、2、3的順序以觀察者當面的視野看的話。即使我們以逆時針順序定義後面的三角形,它現在還是變為順時針。它正是我們打算剔除(丟棄)的不可見的面!

   

        OpenGL的面剔除選項,它預設是禁用狀態的。

        glEnable(GL_CULL_FACE);

        如果我們只想剔除正向面而不是背向面會怎麼樣?我們可以呼叫glCullFace來定義這一行為:

        glCullFace(GL_FRONT);

        也可以通過呼叫glFrontFace,告訴OpenGL我們希望將順時針的面(而不是逆時針的面)定義為正向面:

        glFrontFace(GL_CCW);

 

參考自https://learnopengl-cn.github.io