OpenGL状态管理和绘制几何物体之顶点数组

1. 顶点数组可以减少函数调用次数, 还可以避免冗余数据

2. 使用顶点数组对几何图形进行渲染需要3个步骤

a. 激活最多可达8个数组,每个数组用于存储不同类型的数据:顶点坐标,表面法线,RGBA颜色,辅助颜色,颜色索引,雾坐标,纹理坐标以及多边形的边界标志

b. 把数据放入数组中。 即指针

c. 用这些数据绘制几何图形。 
	OpenGL通过指针从所有的被激活的数组中获取数据。 

有1个函数调用多个数组的功能。 还有混合顶点数组数据。 (可以每个数组保存一种不同类型的数据),也可以把不同类型的数据混合放在同一个数组中。接下来将通过实际例子说明这些方法。 


一、最基本的创建

1. 启用数组
	调用glEnableClientState()函数, 激活被选择的数组。 参数有8个可选择,顶点坐标,表面法线,RGBA颜色,辅助颜色,颜色索引,雾坐标,纹理坐标以及多边形的边界标志。 

	例如:glEnableClientState(GL_NORMAL_ARRAY);

	注意,顶点数组不可以放在显示列表中,因为这些数据被保存在客户端。
2.  指定数组的数据
	例如glVertexPointer(size, type, stride, *pointer);
	size是每个顶点的坐标数量,必须2,3,4. stride是连续的顶点之间的字节偏移量。如果stride是0,数组中的顶点便是紧密相连的。 type是数组中每个坐标的数据类型。 pointer是数组的指针。 当然可以指定8个类型的数组,还是顶点坐标,表面法线,RGBA颜色,辅助颜色,颜色索引,雾坐标,纹理坐标以及多边形的边界标志。 

3. 解引用和渲染
在这一步,数组中的数据被提取,接着发送到服务器,然后发送到图形管线进行渲染
	
a. 最简单的是用glArrayElement(); ,会分别调用那8个对应的索引。 
static GLint vertices[] =
{
    25, -25, 100, 325, 175, 25, 175, 325, 250, 25, 325, 325
};

//
static GLfloat colors[] =
{
    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
};

void setUpPoints()
{
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    
    glColorPointer(3, GL_FLOAT, 0, colors);
    glVertexPointer(2, GL_INT, 0, vertices);
}

void init(void)
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_SMOOTH);
    setUpPoints();
    
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();

    glBegin(GL_TRIANGLES);
	// 
    glArrayElement(2);
    glArrayElement(3);
    glArrayElement(5);
    glEnd();

    glPopMatrix();
    
   // glFlush();
    glutSwapBuffers();  
}


b. 解引用数组元素中的一个列表
glDrawElements();

void setUpPoints()
{
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    
    glColorPointer(3, GL_FLOAT, 0, colors);
    glVertexPointer(2, GL_INT, 0, vertices);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    
    glDrawElements(GL_LINE_STRIP, 4, GL_UNSIGNED_BYTE, oneIndices);
    glPopMatrix();
   
    glutSwapBuffers();
    
}

注意: 每一个的enable 与数据要对应上, glDrawElement最后一个参数是索引的数组


c.   glMultiDrawElements(); 其实就是合并了索引
	相当于
  	for (i=0; i<count; i++)
    {
        if(count[i]>0)
            glDrawElements(mode, count[i], type, indices[i]);
    }
d. glDrawRangeElements()
 	这个只是引入了索引值范围限制。 这可以提高程序的性能。 提取的是有限的数组。 

e. 解引用一个数组元素序列
	glDrawArrays()
	之前的都可以随机进行存取,但这个只能按照顺序访问

f. glMultiDrawArrays
	把几个glDrawArrays在一个函数里进行调用


g. 混合数组

暂时省略






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值