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_着色器_实战01
OpenGL ES_着色器_实战02
OpenGL ES_着色器_实战03

学习是一件开心的额事情

学习目标

  • 理解OpenGL的顶点和几种绘制方法
  • 用多种方式绘制立方体

顶点是啥?
顶点就是坐标位置,不管你是画直线,三角形,正方体,球体,以及3D游戏人物等,都需要顶点来确定其形状。
顶点坐标创建
1.记住顶点的坐标数据类型都设置为GLfloat 类型,这个是OpenGL 要求的,4个字节长度
2.顶点可可以被定为为2维或者三维,这个看你的实际情况!但是你要注意,所有的内部计算都是建立在三维数据的基础之上,比如:你定义一个点(x,y) 是二维形式,OpenGL默认把它的z设置为0,看到这里你以为三维就是(x,y,z)的形式吗?不是的,OpenGL 是根据三维投影几何的齐次方程坐标进行操作的,因此在内部计算是都是用4个浮点坐标值表示(x,y,z,w) 如果w不等于0 那么这些坐标值就对应于与欧几里德三维点(x/w,y/w,z/w)。一般情况下w默认为1.0.

多变形
通过介绍多变型绘制,帮大家建立起几个概念.
多变型是由线段构成的单闭合环,其中线段是由他们的顶点位置的顶点指定的。一般情况下,在绘制多变形时,有这样几种形态:
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);

我们下面讲的内容将围绕这两个函数展开,
先看两个函数的参数:都有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

,如果你选择这个模式,一般四面体的顶点数据就要放在一个数组中:

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

我解释一下参数的含义:
参数1 :Mode :这个不用说,绘制模式,在这种方式我们选择GL_POINTS
参数2: first :从数组的那个位置开始,一般如果数组没有其他类型的数据,只有顶点数据,我们就填 0
参数3: count 就是绘制顶点的个数, 例子中是4*3*3


  • GL_LINES
    绘制一系列的非连接直线段。

    如果我们的顶点数据为:
    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

问:如果顶点的数据为奇数怎么办?
答: 最后一个顶点被忽略,就这么任性!


  • GL_LINE_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
    }
    

效果如下:

GL_LINE_STRIP

绘制方式总结一下: 如果你有n个顶点,先绘制 V0到V1,接着绘制V1到V2,最后绘制Vn-2 到Vn-1 ,因此有n-1 条直线,如果n 不是大于1的,就不会绘制任何直线。


  • GL_LINE_LOOP

    假设顶点数据为:

    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
    绘制原理:
    假设你的顶点数据为

    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的倍数,最后一个或者两个顶点被忽略

GL_TRIANGLES

下面这个两种主要用于顶点索引,使用到的绘制函数为:

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

当然
解释一下:
参数1: mode : 绘制方式
参数2:顶点索引个数
参数3:索引数据类型
参数4:顶点索引数组地址

  • GL_TRIANGLE_STRIP
    绘制方式:如果有n个顶点,索引,i0,i1,i2,第二个三角形为: i2,i1,i3,然后为i2,i3,i4,接下来以此类推!大家有没有发现规律呢?为什么要使用这种方式排列,这种排列方式,可以让所有三角形按照相同的方法绘制,对应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
  }     
  // 执行绘制
  glDrawElements(GL_TRIANGLE_STRIP,6,GL_GL_UNSIGNED_BYTE,index);

计算机其实是这样实现的:
首先我们把点按照顺序排列好(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

顶点索引数组

 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 方式能使用函数 void glDrawArrays (GLenum mode, GLint first, GLsizei count); 吗?
当然可以,只要你的排列方式符合其绘制规则即可!


总结

顶点坐标概念非常重要,希望你能够掌握!如有疑问,请加群:578734141

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容