OpenGL ES

序列绘图和索引绘图

2017-09-29  本文已影响48人  FongG

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

上一篇下一篇

猜你喜欢

热点阅读