顶点数组
2011-08-11 20:45
127 查看
OpenGL提供了一个称之为顶点数组的工具,它扩展了数组的使用方式,可以显著地较少绘制立方体的函数调用次数。其主要思想是存储在数组中的信息可以被存储在客户端中,并通过单次函数调用来访问。
OpenGL为六种类型的数组提供了支持:顶点、颜色、颜色索引、法线、纹理坐标以及边标记。
顶点及颜色是我们接下去要使用的数组,我们通过对它们的使用来理解顶点数组。
使用顶点数组需要三个步骤:
1. 同OpenGL的其它功能一样,必须将其启用。
2. 必须指定数组的格式。
3. 用该数组绘制场景。
以顶点数组为例:
1. 定义一个二维顶点数组
static GLfloat Vertices[][3]= {
{-1.0,-1.0, 1.0},
{-1.0, 1.0, 1.0},
{1.0, 1.0, 1.0},
{1.0, -1.0, 1.0},
{-1.0,-1.0, -1.0},
{-1.0, 1.0, -1.0},
{1.0, 1.0, -1.0},
{1.0, -1.0, -1.0}
};
2. 根据使用顶点数组三个步骤中的第一步,调用函数
glEnableClientState(GL_VERTEX_ARRAY);
这样就启动了Vertex的顶点数组功能了。
3. 根据使用顶点数组三个步骤中的第二步,调用函数
glVertexPointer(3,GL_FLOAT,0,Vertices);
函数中,第一个参数提供了数组中列数,第二、三个参数提供了数组中每一个元素的数据类型,第四个参数就是该数组的首地址。仔细观察可以发现,上述的数组形式实质 上是对整个数组的一个描绘,从数组元素的数据类型、列数、首地址,可以说提供了对该数组的完整信息。这个函数的第一、二、三个参数就是对一个顶点的数据类型的描 述。
4. 定义对顶点的访问顺序索引
GLubyte CubeIndices[]= {
{0,3, 2, 1},
{2,3, 7, 6},
{0,4, 7, 3},
{1,2, 6, 5},
{4,5, 6, 7},
{0,1, 5, 4}
};
5. 根据使用顶点数组三个步骤中的第三步:绘制
void glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,CubeIndices);
该函数的第一个参数就是glBegin*中的那个绘制模式参数,第二个参数就是顶点数的绘制次数,第三、四个参数就是顶点索引数组的描述。
当然,该函数也可以进行如下形式的调用
for(int i=0;i<6;i++)
glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,CubeIndices);
我们来查看一下究竟上面的调用执行了上面,这有利于我们更好地理解顶点数组。
以glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,CubeIndices)为例。
...
statici=0;
if(EnableColorArray())glColor3fv(Colors[i]);
//法线、纹理映射etc
……
glBegin(GL_POLYGON);
glVertex3fv(Vertices[i]);
……
glEnd();
i++;
小结:
顶点数组、颜色数组、法线数组……的关键步骤在于精确地定义,即写出二维数组、正确地描述出顶点数组及颜色数组……,同时写对了顶点的访问顺序,最后就是正确地调用
glDrawElements*函数。
OpenGL为六种类型的数组提供了支持:顶点、颜色、颜色索引、法线、纹理坐标以及边标记。
顶点及颜色是我们接下去要使用的数组,我们通过对它们的使用来理解顶点数组。
使用顶点数组需要三个步骤:
1. 同OpenGL的其它功能一样,必须将其启用。
2. 必须指定数组的格式。
3. 用该数组绘制场景。
以顶点数组为例:
1. 定义一个二维顶点数组
static GLfloat Vertices[][3]= {
{-1.0,-1.0, 1.0},
{-1.0, 1.0, 1.0},
{1.0, 1.0, 1.0},
{1.0, -1.0, 1.0},
{-1.0,-1.0, -1.0},
{-1.0, 1.0, -1.0},
{1.0, 1.0, -1.0},
{1.0, -1.0, -1.0}
};
2. 根据使用顶点数组三个步骤中的第一步,调用函数
glEnableClientState(GL_VERTEX_ARRAY);
这样就启动了Vertex的顶点数组功能了。
3. 根据使用顶点数组三个步骤中的第二步,调用函数
glVertexPointer(3,GL_FLOAT,0,Vertices);
函数中,第一个参数提供了数组中列数,第二、三个参数提供了数组中每一个元素的数据类型,第四个参数就是该数组的首地址。仔细观察可以发现,上述的数组形式实质 上是对整个数组的一个描绘,从数组元素的数据类型、列数、首地址,可以说提供了对该数组的完整信息。这个函数的第一、二、三个参数就是对一个顶点的数据类型的描 述。
4. 定义对顶点的访问顺序索引
GLubyte CubeIndices[]= {
{0,3, 2, 1},
{2,3, 7, 6},
{0,4, 7, 3},
{1,2, 6, 5},
{4,5, 6, 7},
{0,1, 5, 4}
};
5. 根据使用顶点数组三个步骤中的第三步:绘制
void glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,CubeIndices);
该函数的第一个参数就是glBegin*中的那个绘制模式参数,第二个参数就是顶点数的绘制次数,第三、四个参数就是顶点索引数组的描述。
当然,该函数也可以进行如下形式的调用
for(int i=0;i<6;i++)
glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,CubeIndices);
我们来查看一下究竟上面的调用执行了上面,这有利于我们更好地理解顶点数组。
以glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,CubeIndices)为例。
...
statici=0;
if(EnableColorArray())glColor3fv(Colors[i]);
//法线、纹理映射etc
……
glBegin(GL_POLYGON);
glVertex3fv(Vertices[i]);
……
glEnd();
i++;
小结:
顶点数组、颜色数组、法线数组……的关键步骤在于精确地定义,即写出二维数组、正确地描述出顶点数组及颜色数组……,同时写对了顶点的访问顺序,最后就是正确地调用
glDrawElements*函数。
相关文章推荐
- 【OpenGL 学习笔记04】顶点数组
- OpenGL--顶点数组与缓冲区中使用顶点数组
- OpenGL顶点数组
- Qt下的OpenGL 编程(7)顶点数组和显示列表
- Qt下的OpenGL 编程(7)顶点数组和显示列表
- 顶点数组对象 VAO(Vertex Array Object)
- OpenGL笔记:三. 顶点数组和解引用
- 【OpenGL 学习笔记04】顶点数组
- OpenGL--顶点数组与缓冲区中使用顶点数组
- OpenGL ES中的顶点数组、顶点属性、缓冲区对象
- OpenGL学习七:顶点数组
- OpenGL状态管理和绘制几何物体之顶点数组
- OpenGL ES 3.0编程指南学习笔记 第6章 顶点属性、顶点数组和缓冲区对象
- OpenGL 学习笔记(4)顶点数组
- jogl中使用顶点数组
- Qt下的OpenGL 编程(7)顶点数组和显示列表
- OpenGL编程指南-顶点数组、视图变换、投影变换
- 2.8 顶点数组对象
- OpenGL笔记15 顶点数组
- opengl顶点数组