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.只繪制點
繪制面
不管繪制平面和繪制立體圖形,我們都是在面上進行操作的起宽,要繪制一個面洲胖,需要繪制多個小三角形。
我們就拿繪制四面體舉例子:
我們先把它的頂點坐標寫設(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個頂點的每一個都繪制一個點
橘忱,如果你選擇這個模式赴魁,一般四面體的頂點數(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,又是一條直線。如下圖:
問:如果頂點的數(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 }
效果如下:
繪制方式總結(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 }
效果如下:
繪制步驟: 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ù)坠狡,最后一個或者兩個頂點被忽略
下面這個兩種主要用于頂點索引,使用到的繪制函數(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個三角形
看這張圖,如果使用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 類似,頂點坐標的順序變一下岭接,怎么拆分富拗,找多個三角形的公共點,如果你的圖像沒有多個公共點鸣戴,那就需要多添加幾個索引.
頂點索引數(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