zoukankan      html  css  js  c++  java
  • OpenGL顶点数组

    OpenGL中,如果要绘制图元,一般来说会使用:

    glBegin(GL_LINES);
       glVertex3f(0.0f, 0.0f, 0.0f); 
       glVertex3f(1.0f, 0.0f, 0.0f);
    glEnd();

    但是,如果顶点数太多,这种方法需要频繁调用函数,效率太低。这就要用到顶点数组。

    1. 启用顶点数组

    OpenGL是一种状态机,在用某一功能前,必须先开启这项功能,用完之后,也可以关闭。

    启用和关闭顶点数组的代码如下:

    glEnableClientState(GL_VERTEX_ARRAY);   //启用
    glDisableClientState(GL_VERTEX_ARRAY);  //关闭

    其中,GL_VERTEX_ARRAY是数组的类型,共有八种:

    • GL_VERTEX_ARRAY
    • GL_COLOR_ARRAY
    • GL_SECOND_COLOR_ARRAY
    • GL_INDEX_ARRAY
    • GL_NORMAL_ARRAY
    • GL_FOG_COORDINATE_ARRAY
    • GL_TEXTURE_COORD_ARRAY
    • GL_FLAG_ARRAY

    2. 指定数组

    启用了顶点数组后,接下来要指定:哪一个数组是顶点数组。函数如下:

    **void glVertexPointer( GLint size,
    GLenum type,
    GLsizei stride,
    const GLvoid* pointer);**

    参数:

    size - 每个顶点的坐标数目,必须是2,3,或4。

    type - 顶点坐标的数据类型,GL_SHORT, GL_INT, GL_FLOAT 或 GL_DOUBLE

    stride - 两个相邻顶点之间的偏移量,单位为字节,如果为0,表面顶点是紧密存储的。

    pointer - 数组中第一项的第一个坐标的内存地址。

    此外,还有 glColorPointer、glIndexPointer等,用于指定别的数组。

    使用方法如下:

    GLfloat vertexs[] = {0.0f, 0.0f, 0.0f, 0.2f, 0.0f, 0.0f,
                        -0.2f, 0.0f, 0.0f, 0.0f, 0.2f, 0.0f,
                        0.0f, -0.2f, 0.0f, 0.0f, 0.0f, 0.2f,
                        0.0f, 0.0f, -0.2f};
    
    GLubyte indexs[] = {0,1,2,3,4,5,6};
    
    glEnableClientState(GL_VERTEX_ARRAY);   //启用顶点数组
    glEnableClientState(GL_INDEX_ARRAY);    //启用索引数组
    
    glVertexPointer(3,GL_FLOAT,0,vertexs);  //指定顶点数组
    glIndexPointer(GL_UNSIGNED_BYTE,0,indexs);  //指定索引数组

    3. 绘图

    有三个函数用于绘图。

    void glArrayElement( GLint i);

    通过索引数组指定顶点,放在glBegin()和glEnd()之间。例如:

    glBegin(GL_POINTS);
            glArrayElement(indexs[0]);
            glArrayElement(indexs[1]);
    glEnd();

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

    mode - 图元类型,例如 GL_POINTS、GL_LINES

    count - 元素个数,索引数组存在indices中

    type - 索引数组的数据类型,必须是GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, 或 GL_UNSIGNED_INT

    indices - 索引数组

    使用方法例如:

    glDrawElements(GL_POINTS,7,GL_UNSIGNED_BYTE,indexs);

    void glDrawArrays( GLenum mode, GLint first, GLsizei count);

    对每个被启用的数组(顶点数组,颜色数组,索引数组),绘制从firstfirst+count-1的元素。类型为mode,例如GL_POINTS。

    glDrawArrays(GL_POINTS,0,7);
  • 相关阅读:
    [bzoj4721][noip2016]蚯蚓
    [bzoj1112][POI2008]砖块KLO
    [bzoj3196][tyvj1728]普通平衡树
    [bzoj1596][Usaco2008 Jan]电话网络
    [bzoj3371][poj2009][Usaco2004 Mar]Moo University
    [bzoj2208][Jsoi2010]连通数
    郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans
    郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(一)推荐系统概述
    Python_sklearn机器学习库学习笔记(四)decision_tree(决策树)
    C++STL学习笔记_(1)vector知识
  • 原文地址:https://www.cnblogs.com/new0801/p/6176772.html
Copyright © 2011-2022 走看看