OPengl学习(四)——顶点数组


1、 问题

1、在前面我们实现一个多彩三角形,调用三次glvertext()函数,如果在多边形,如20条边的,那么就要使用22次函数,如果还有颜色等其他要求,则会更多函数调用,多次函数调用开销比较大,能不能有其他方法,减少函数调用?

2、在正方体里,每一个顶点其实是三条边共用,每次绘制的时候都会调用三次,能不有共享顶点的冗余处理?

答案来了:那就是顶点数组。
定点数组:opengl提供一些顶点数组函数,允许只用少数数组指定大量的与顶点相关的数据,并用少量函数访问这些数据,可以解决上述问题。


2、步骤

使用顶点数组对几何图形渲染大致需要如下三个步骤:

1、激活(启用)最多可达八个数组(实际同时最多六个,有两个是相克的),每个数组有不同类型的数据:顶点坐标、表面法线、RGBA颜色、辅助颜色、颜色索引、雾坐标、纹理坐标、多边形边界标识。我们也可以用混合顶底数组,将上述用到的数组按照规则写成一个数组。
2、把数据放入数组中,这些数组是通过他们的内存地址进行访问的。
3、用这些数据绘制几何图形。


2.1 激活数组

使用函数 :

glEnableClientState(GLenum type);

2.2 指定数组的数据

可以通过八个不同函数用于之地鞥数组,每个函数用于指定不同类型的数组,另外也可以用一个函数指定多个数组。
使用函数 :
在这里插入图片描述
这里 stride 跨距参数,一般在混合数组中用到,就是说告诉取值如何不长取值。

2.3 解引用和渲染

解引用就是 取得指针所指向的数据,解引用可以是单个数组,也可以是数组元素列表等。
主要用的函数

glArrayElement(GLint ith);    //单个数组元素
glArrayElements(GLenum mode, GLSize count, GLenum type,const GLvoid *indicas);           //数组元素列表
glDrawElements();

3、例子

主要部分如下:

 static GLint v1[] = {
    
    
            25,25,
            100,325,
            175,25,
            175,325,
            250,25,
            325,325
    };
    static GLfloat c1[] ={
    
    
        1.0,0.2,0.2,
        0.2,0.2,1.0,
        0.8,1.0,0.2,
        0.75,0.75,0.75,
        0.35,0.35,0.35,
        0.5,0.5,0.5
    };
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(3,GL_FLOAT,0,c1);
    glVertexPointer(2,GL_INT,0,v1);
    glBegin(GL_TRIANGLES);
    glArrayElement(2);
    glArrayElement(3);
    glArrayElement(5);
    glEnd();

猜你喜欢

转载自blog.csdn.net/ljsant/article/details/128340100