OpenGL笔记:三. 顶点数组和解引用

摘要:在OpenGL绘制图形时,往往一个顶点会被重用多次(比如,一个正方体有8个顶点,但是每个顶点是3个面所共有,所以每一个顶点都必须指定3次),然而每次指定顶点都会有大量的函数调用,这回大大增加系统开销,为了解决这个问题OpenGL提供了顶点数组。

1. 启用

    glEnableClientState( ARRAY_TYPE )
    ARRAY_TYPE:
        GL_VERTEX_ARRAY, 
        GL_COLOR_ARRAY, GL_SECONDARY_COLOR_ARRAY, 
        GL_INDEX_ARRAY, GL_NORMAL_ARRAY, 
        GL_FOG_COORD_ARRAY, GL_TEXTURE_COORD_ARRAY, 
        GL_EDGE_FLAG_ARRAY 
    
    glDisableClientState(ARRAY_TYPE);
    

2. 指定数据

    glVertexPointer( size, type, stride, *pointer )
        size: 每一组数据的大小
        type:Data Type
        stride:两个连续元素之间的字节数
        
    eg:
        static GLint vertex[] = {0, 0, 1,  0, 1, 0};
        glVertexPointer( 3, GLint, 0, vertex );
        
    void glColorPointer( size,  type,  stride, *pointer);
    void glSecondaryColorPointer( size,  type,  stride, *pointer);
    void glIndexPointer( type,  stride,  *pointer);
    void glNormalPointer( type,  stride, *pointer);
    void glFogCoordPointer( type,  stride, *pointer);
    void glTexCoordPointer( size,  type,  stride, *pointer);
    void glEdgeFlagPointer( stride,  *pointer);
    

3. 解引用——方便使用定点数组

    在此之前,数据在客户端,此步骤就是把数据发送到服务器端
    3.1 解引用Element————随机访问
    (1)glArrayElement——单元素
        glArrayElement(index)
        直接调用数组中的值
        glBegin(GL_TRIANGLES);
            glArrayElement(2);
            glArrayElement(3);
            glArrayElement(5);
        glEnd();
        
    (2)glDrawElements——多个元素
        glDrawElements(mode, count, type, *pointer)
        等价于:
        glBegin(mode);
        for (i = 0; i < count; i++)
           glArrayElement(pointer[i]);
        glEnd();
        
        type:数组类型
            GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT
        
    (3)glMultiDrawElements
        glMultiDrawElements(mode, *count, type, **pointer, arr_count)
        等价于:
        for (i = 0; i < primcount; i++) 
        {
           if (count[i] > 0)
              glDrawElements(mode, count[i], type, pointer[i]);
        }
        
    3.2 解引用Array————顺序访问
    (1)glDrawArray( mode, first, count )
        glBegin (mode);
        for (i = 0; i < count; i++)
           glArrayElement(first + i);
        glEnd();
    (2)glMultiDrawArrays( mode, *first, *count, arr_count );
        for (i = 0; i < primcount; i++) 
        {
           if (count[i] > 0)
              glDrawArrays(mode, first[i], count[i]);
        }
    3.3 混合数组
        数组中可包含:纹理,颜色,法向量,顶点数据
        glInterleavedArrays( format, stride, *pointer );

        format: GL__T__C__N__V


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值