• 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);
  • 相关阅读:
    Micorosoft 2013年笔试题
    Dropbox推荐使用
    swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念
    swift_简单值 | 元祖 | 流程控制 | 字符串 | 集合
    Swift函数的定义
    swift_Dictionary 字典
    Xcode创建Object-C程序
    Spring事务管理者与Spring事务注解--声明式事务
    JDK注解替代Hibernate的Entity映射
    关于JAVA EE项目在WEB-INF目录下的jsp页面如何访问WebRoot中的CSS和JS文件
  • 原文地址:https://www.cnblogs.com/new0801/p/6176772.html
Copyright © 2020-2023  润新知