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_著色器_預(yù)處理
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ù)類型都設(shè)置為GLfloat 類型嘹悼,這個是OpenGL 要求的,4個字節(jié)長度
2.頂點可可以被定為為2維或者三維沦寂,這個看你的實際情況!但是你要注意,所有的內(nèi)部計算都是建立在三維數(shù)據(jù)的基礎(chǔ)之上淘衙,比如:你定義一個點(x,y) 是二維形式传藏,OpenGL默認把它的z設(shè)置為0,看到這里你以為三維就是(x,y,z)的形式嗎?不是的彤守,OpenGL 是根據(jù)三維投影幾何的齊次方程坐標進行操作的毯侦,因此在內(nèi)部計算是都是用4個浮點坐標值表示(x,y,z,w) 如果w不等于0 那么這些坐標值就對應(yīng)于與歐幾里德三維點(x/w,y/w,z/w)。一般情況下w默認為1.0.

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

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

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

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

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);

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

下面這個是我從蘋果的頭文件復(fù)制的

#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,
  }

那么我們繪制的方法相應(yīng)的會選擇 :

  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è)頂點數(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

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


  • GL_LINE_LOOP

    假設(shè)頂點數(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è)你的頂點數(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ī)律呢逃沿?為什么要使用這種方式排列,這種排列方式幻锁,可以讓所有三角形按照相同的方法繪制凯亮,對應(yīng)OpenGL 的一些操作,維持方向很重要!
四面體

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

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

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

  頂點坐標:
  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
  }

調(diào)用繪制方法的時候啃沪,需要調(diào)用兩次

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ī)則即可!


總結(jié)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市入偷,隨后出現(xiàn)的幾起案子追驴,更是在濱河造成了極大的恐慌,老刑警劉巖疏之,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殿雪,死亡現(xiàn)場離奇詭異,居然都是意外死亡体捏,警方通過查閱死者的電腦和手機冠摄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門糯崎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人河泳,你說我怎么就攤上這事沃呢。” “怎么了拆挥?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵薄霜,是天一觀的道長。 經(jīng)常有香客問我纸兔,道長惰瓜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任汉矿,我火速辦了婚禮崎坊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洲拇。我一直安慰自己奈揍,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布赋续。 她就那樣靜靜地躺著男翰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纽乱。 梳的紋絲不亂的頭發(fā)上蛾绎,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音鸦列,去河邊找鬼租冠。 笑死,一個胖子當著我的面吹牛敛熬,可吹牛的內(nèi)容都是我干的肺稀。 我是一名探鬼主播第股,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼应民,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夕吻?” 一聲冷哼從身側(cè)響起诲锹,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涉馅,沒想到半個月后归园,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡稚矿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年庸诱,在試婚紗的時候發(fā)現(xiàn)自己被綠了捻浦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡桥爽,死狀恐怖朱灿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钠四,我是刑警寧澤盗扒,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站缀去,受9級特大地震影響侣灶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缕碎,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一褥影、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咏雌,春花似錦伪阶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熏迹,卻和暖如春檐薯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背注暗。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工坛缕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捆昏。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓赚楚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骗卜。 傳聞我的和親對象是個殘疾皇子宠页,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容