美文网首页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

    相关文章

      网友评论

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

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