OpengL ES _ 入門_02

OpenGL ES _ 入門_01
OpenGL ES _ 入門_02
OpenGL ES _ 入門_03
OpenGL ES _ 入門_04
OpenGL ES _ 入門_05
OpenGL ES _ 入門練習_01
OpenGL ES _ 入門練習_02
OpenGL ES _ 入門練習_03
OpenGL ES _ 入門練習_04
OpenGL ES _ 入門練習_05
OpenGL ES _ 入門練習_06
OpenGL ES _ 著色器 _ 介紹
OpenGL ES _ 著色器 _ 程序
OpenGL ES _ 著色器 _ 語法
OpenGL ES_著色器_紋理圖像
OpenGL ES_著色器_預處理
OpenGL ES_著色器_頂點著色器詳解
OpenGL ES_著色器_片斷著色器詳解
OpenGL ES_著色器_實戰(zhàn)01
OpenGL ES_著色器_實戰(zhàn)02
OpenGL ES_著色器_實戰(zhàn)03

學習是一件開心的額事情

學習目標

  • 理解OpenGL的頂點和幾種繪制方法
  • 用多種方式繪制立方體

頂點是啥?
頂點就是坐標位置,不管你是畫直線,三角形,正方體,球體,以及3D游戲人物等,都需要頂點來確定其形狀。
頂點坐標創(chuàng)建
1.記住頂點的坐標數(shù)據(jù)類型都設置為GLfloat 類型,這個是OpenGL 要求的,4個字節(jié)長度
2.頂點可可以被定為為2維或者三維,這個看你的實際情況!但是你要注意,所有的內部計算都是建立在三維數(shù)據(jù)的基礎之上,比如:你定義一個點(x,y) 是二維形式,OpenGL默認把它的z設置為0,看到這里你以為三維就是(x,y,z)的形式嗎?不是的,OpenGL 是根據(jù)三維投影幾何的齊次方程坐標進行操作的,因此在內部計算是都是用4個浮點坐標值表示(x,y,z,w) 如果w不等于0 那么這些坐標值就對應于與歐幾里德三維點(x/w,y/w,z/w)。一般情況下w默認為1.0.

多變形
通過介紹多變型繪制,幫大家建立起幾個概念.
多變型是由線段構成的單閉合環(huán),其中線段是由他們的頂點位置的頂點指定的。一般情況下,在繪制多變形時,有這樣幾種形態(tài):
1.內部的像素將被填充
2.繪制外邊的邊框
3.只繪制點

繪制面
不管繪制平面和繪制立體圖形,我們都是在面上進行操作的,要繪制一個面,需要繪制多個小三角形。
我們就拿繪制四面體舉例子:

F30063E6-2137-4756-A627-4EA0022240E2.png

我們先把它的頂點坐標寫設定一下:

static GLfloat vertex[4\*3] = {
  0,0.5,0,   //V0
  -0.5,0,0, //V1
  0.5,0,0,   //V2
  0,0,-0.5  // V3
 }

我們有兩個繪制頂點的方法可供選擇:

 void  glDrawArrays (GLenum mode, GLint first, GLsizei count);
 void  glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);

我們下面講的內容將圍繞這兩個函數(shù)展開,
先看兩個函數(shù)的參數(shù):都有mode,那么這個mode 代表什么意思的,其實就是繪制模式:

下面這個是我從蘋果的頭文件復制的

#define GL_POINTS                                        0x0000
#define GL_LINES                                         0x0001
#define GL_LINE_LOOP                                     0x0002
#define GL_LINE_STRIP                                    0x0003
#define GL_TRIANGLES                                     0x0004
#define GL_TRIANGLE_STRIP                                0x0005
#define GL_TRIANGLE_FAN                                  0x0006

我來講講它們怎么使用!
剛才說了,繪制多面體,就是要繪制多個三角形,以三角形為最小單位繪制,記住這句話!


  • GL_POINTS
    給n個頂點的每一個都繪制一個點
GL_POINTS

,如果你選擇這個模式,一般四面體的頂點數(shù)據(jù)就要放在一個數(shù)組中:

  static GLfloat vertex[4\*3\*3] = {
   // 第一個三角形
   0,0.5,0,
   -0.5,0,0,
   0,0,0.5
   // 第二個三角形
   0,0.5,0,
   0.5,0,0,
   0,0,0.5
  // 第三個三角形
    -0.5,0,0,
    0,0.5,0,
    0,0,0.5
  // 第四個三角形
  -0.5,0,0,
  0,0,0.5
  0,0.0,0.5,
  }

那么我們繪制的方法相應的會選擇 :

  void  glDrawArrays (GLenum mode, GLint first, GLsizei count);

我解釋一下參數(shù)的含義:
參數(shù)1 :Mode :這個不用說,繪制模式,在這種方式我們選擇GL_POINTS
參數(shù)2: first :從數(shù)組的那個位置開始,一般如果數(shù)組沒有其他類型的數(shù)據(jù),只有頂點數(shù)據(jù),我們就填 0
參數(shù)3: count 就是繪制頂點的個數(shù), 例子中是4*3*3


  • GL_LINES
    繪制一系列的非連接直線段。

    如果我們的頂點數(shù)據(jù)為:
    static GLfloat vertex[4*3] = {
    0,0.5,0, //V0
    -0.5,0,0, //V1
    0.5,0,0, //V2
    0,0,-0.5 // V3
    }
    我們繪制使用方法:

     void  glDrawArrays (GLenum mode, GLint first, GLsizei count);
    

mode:GL_LINES
它的繪制過程是這樣的:先繪制V0,V1一條直線, 然后繪制V2,V3,又是一條直線。如下圖:

FCE77035-AE23-45CB-8311-FE85455B40CE.png

問:如果頂點的數(shù)據(jù)為奇數(shù)怎么辦?
答: 最后一個頂點被忽略,就這么任性!


  • GL_LINE_STRIP
    假設頂點數(shù)據(jù)為:

    static GLfloat vertex[4\*3] = {
    0,0.5,0,   //V0
    -0.5,0,0, //V1
    0.5,0,0,   //V2
    0,0,-0.5  // V3
    }
    

效果如下:

GL_LINE_STRIP

繪制方式總結一下: 如果你有n個頂點,先繪制 V0到V1,接著繪制V1到V2,最后繪制Vn-2 到Vn-1 ,因此有n-1 條直線,如果n 不是大于1的,就不會繪制任何直線。


  • GL_LINE_LOOP

    假設頂點數(shù)據(jù)為:

    static GLfloat vertex[4*3] = {
    0,0.5,0,   //V0
    -0.5,0,0, //V1
    0.5,0,0,   //V2
    0,0,-0.5  // V3
    }
    

    效果如下:

GL_LINE_LOOP

繪制步驟: V0到V1,V1到V2,V2到V3,V3到V0


重點來了,下面是繪制立體圖形比較重要的幾種方式

  • GL_TRIANGLES
    繪制原理:
    假設你的頂點數(shù)據(jù)為

    static GLfloat vertex[4*3*3] = {
    // 第一個三角形
    0,0.5,0,
    -0.5,0,0,
    0,0,0.5
    // 第二個三角形
    0,0.5,0,
    0.5,0,0,
    0,0,0.5
    // 第三個三角形
    -0.5,0,0,
    0,0.5,0,
    0,0,0.5
    // 第四個三角形
    -0.5,0,0,
    0,0,0.5
    0,0.0,0.5,
    }
    里面有12 個頂點,頂點坐標為(x,y,z) 的形式,頂點為V0 到V11, 繪制三角形的方式為:V0、V1、V2,第二個三角形為 V3,V4,V5,第三個三角形為V6、V7、V8 最后一個為 V9、V10、V11,繪制出來的是三角形,而不是三條線。
    注意一點,如果頂點N不是3的倍數(shù),最后一個或者兩個頂點被忽略

GL_TRIANGLES

下面這個兩種主要用于頂點索引,使用到的繪制函數(shù)為:

void  glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);

當然
解釋一下:
參數(shù)1: mode : 繪制方式
參數(shù)2:頂點索引個數(shù)
參數(shù)3:索引數(shù)據(jù)類型
參數(shù)4:頂點索引數(shù)組地址

  • GL_TRIANGLE_STRIP
    繪制方式:如果有n個頂點,索引,i0,i1,i2,第二個三角形為: i2,i1,i3,然后為i2,i3,i4,接下來以此類推!大家有沒有發(fā)現(xiàn)規(guī)律呢?為什么要使用這種方式排列,這種排列方式,可以讓所有三角形按照相同的方法繪制,對應OpenGL 的一些操作,維持方向很重要!
四面體

我們把這個面從V0 開始,裁剪組合成4個三角形

12D70C2D-FBE2-4F76-B05D-E91519397B41.png

看這張圖,如果使用GL_TRANGLE_STRIP 頂點索引應該是怎么的排列呢?

  頂點坐標:
  static GLfloat vertex[4*3] = {
  0,0.5,0,   //V0
  -0.5,0,0, //V1
  0.5,0,0,   //V2
  0,0,-0.5  // V3
  }
   坐標索引
  static GLuint index[] = {
   3,1,0,2,3,1
  }     
  // 執(zhí)行繪制
  glDrawElements(GL_TRIANGLE_STRIP,6,GL_GL_UNSIGNED_BYTE,index);

計算機其實是這樣實現(xiàn)的:
首先我們把點按照順序排列好(3,1,0,2,3,1)
(3,1,0)
(1,0,2) 變換前兩個位置 (0,1,2)
(0,2,3)
(2,3,1) 變換前兩個位置(3,2,1)

保證繪制的每個三角形順序(逆時針)一致。

  • GL_TRIANGLE_FAN
    繪制方式: 和GL_TRIANGLE_STRIP 類似,頂點坐標的順序變一下,怎么拆分,找多個三角形的公共點,如果你的圖像沒有多個公共點,那就需要多添加幾個索引.
四面體
GL_TRIANGLE_FAN

頂點索引數(shù)組

 static GLuint index1[5] = {
   0,1,2,3,1
   }
  static GLuint index2[3] = {
    1,3,2
  }

調用繪制方法的時候,需要調用兩次

glDrawElements(GL_TRIANGLE_FAN,5,GL_GL_UNSIGNED_BYTE,index1);
glDrawElements(GL_TRIANGLE_FAN,3,GL_GL_UNSIGNED_BYTE,index2);

問: GL_TRIANGLE_STRIP 和 GL_TRIANGLE_FAN 方式能使用函數(shù) void glDrawArrays (GLenum mode, GLint first, GLsizei count); 嗎?
當然可以,只要你的排列方式符合其繪制規(guī)則即可!


總結

頂點坐標概念非常重要,希望你能夠掌握!如有疑問,請加群:578734141

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容