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. 混合数组
暂时省略
OpenGL状态管理和绘制几何物体之顶点数组
最新推荐文章于 2023-01-09 16:06:51 发布