美文网首页OpenGL ES
序列绘图和索引绘图

序列绘图和索引绘图

作者: FongG | 来源:发表于2017-09-29 11:19 被阅读48次

openGL ES有2种绘图方式

  1. 序列绘图
  2. 索引绘图

“序列绘图”,顾名思义就是将顶点一个个按顺序排列存放在顶点缓存中。绘图时,我们按照组成图元顶点数量(点:一个顶点;线:两个顶点;三角形:三个顶点)一个个读取下来,并绘制形成图形。可以用下图表示出来:

20160406000517221.png
  如果我们是绘制三角形,且开始偏移为0,那么可以绘制123、456两个三角形。

创建、绑定、缓存

buffer对象绑定的是GL_ARRAY_BUFFER

    //前三个是顶点坐标, 后面两个是纹理坐标
    GLfloat attrArr[] =
    {
        0.5f, -0.5f, -1.0f,     1.0f, 0.0f,//右下  《-- 右下
        -0.5f, 0.5f, -1.0f,     0.0f, 1.0f,//左上  《-- 左上
        -0.5f, -0.5f, -1.0f,    0.0f, 0.0f,//左下  《-- 左下
        
        0.5f, 0.5f, -1.0f,      1.0f, 1.0f,
        -0.5f, 0.5f, -1.0f,     0.0f, 1.0f,
        0.5f, -0.5f, -1.0f,     1.0f, 0.0f,
    };
    
    //创建一个缓存区对象,绑定到GL_ARRAY_BUFFER,然后将顶点数据缓存
    GLuint attrBuffer;
    glGenBuffers(1, &attrBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, attrBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(attrArr), attrArr, GL_DYNAMIC_DRAW);

绘图

6个点render primitives from array data

    glDrawArrays(GL_TRIANGLES, 0, 6);

“索引绘图”,顶点同样也是存放在顶点缓存中。但是在绘图过程中,顶点读取顺序并不是按照序列顺序读取,而是根据我们提供的顶点索引读取,比方我们要绘制一个三角形,我们可以用第3个、第5个、第2个这三个顶点组成。用下图表示如下:

如果我们是绘制三角形,那么是绘制352、647两个三角形。
从上面中,我们可以看出索引绘图方式比序列绘图方式优势地方,在于:不需要定义重复顶点信息,可以复用之前定义过的信息,这样可以大大减轻编码工作;对于内存访问非常有效率,因为大多数物体是由相似的三角形组成的,而且这些三角形有大量重复的顶点,这些重复顶点占用了同一块内存。

创建、绑定、缓存

buffer对象绑定的是GL_ELEMENT_ARRAY_BUFFER

例如

    //顶点数据,前三个是顶点坐标, 中间三个是顶点颜色,    最后两个是纹理坐标
    GLfloat attrArr[] =
    {
        -0.5f, 0.5f, 0.0f,      0.0f, 0.0f, 0.5f,       0.0f, 1.0f,//左上
        0.5f, 0.5f, 0.0f,       0.0f, 0.5f, 0.0f,       1.0f, 1.0f,//右上
        -0.5f, -0.5f, 0.0f,     0.5f, 0.0f, 1.0f,       0.0f, 0.0f,//左下
        0.5f, -0.5f, 0.0f,      0.0f, 0.0f, 0.5f,       1.0f, 0.0f,//右下
        0.0f, 0.0f, 1.0f,       1.0f, 1.0f, 1.0f,       0.5f, 0.5f,//顶点
    };
    //顶点索引
    GLuint indices[] =
    {
        0, 3, 2,
        0, 1, 3,
        0, 2, 4,
        0, 4, 1,
        2, 3, 4,
        1, 4, 3,
    };
    self.mCount = sizeof(indices) / sizeof(GLuint);
    
    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(attrArr), attrArr, GL_STATIC_DRAW);
    
    GLuint index;
    glGenBuffers(1, &index);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

绘图

self.mCount = sizeof(indices) / sizeof(GLuint); //顶点索引位数3*6 = 18
glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT, 0);

r:http://blog.csdn.net/dionysos_lai/article/details/51069430

相关文章

  • 序列绘图和索引绘图

    openGL ES有2种绘图方式 序列绘图 索引绘图 “序列绘图”,顾名思义就是将顶点一个个按顺序排列存放在顶点缓...

  • 使用索引绘图(转)

    文章转至 OpenGL学习脚印: 使用索引绘图(index drawing) 通过本节可以了解到 索引绘图使用方法...

  • GLKit索引绘图并添加纹理案例

    索引绘图的理解及案例效果,请查看GLSL索引绘图 一、绘制准备 创建context 设置GLKView对象 设置当...

  • 索引绘图

    索引绘图,就是为每一个顶点设定一个索引标号,然后再定义一个数组,以3个索引为一组,组成三角形.这个就叫做索引绘图,...

  • 11-1.GLSL-索引绘图

    索引绘图 索引绘图是一种由开发者指定顶点连接顺序的绘图方式。优势是可以复用顶点,减少内存的使用。如绘制一个金字塔3...

  • OpenGL ES(六)-绘图方式

    序列绘图 序列绘图,顾名思义就是将顶点一个个按顺序排列存放在顶点缓存中。绘图时,我们按照组成图元顶点数量(点:一个...

  • 06-什么是索引绘图

    一、什么是索引绘图? 所谓索引绘图是一种在绘制大网格(mesh)时的一种可以高效绘图的一种方式,普通的绘制三角形需...

  • GLSL实现纹理与颜色混合

    OpenGL ES 索引绘图 - 简书 上文介绍了使用索引绘图绘制金字塔案例,本文基于金字塔案例的基础上,使用GL...

  • OpenGLES(六)-综合案例:索引绘图

    OpenGLES(六)-综合案例:索引绘图 索引绘图 相信看这篇文章的同学应该对图元装配方式很熟悉了吧?提供一个参...

  • OpenGL ES 案例06:GLKit使用索引绘图

    本案例的主要目的是理解GLKit中的索引绘图 如果对索引绘图有不了解的,请先看OpenGL ES 案例05:GLS...

网友评论

    本文标题:序列绘图和索引绘图

    本文链接:https://www.haomeiwen.com/subject/zjfiextx.html