2009-07-03 23:29
提高绘制立方体的时效率: 1、直接采用顶点绘制:24个顶点,6个面 glBegin( GL_QUADS ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); glVertex3f( 0.5, 0.0, 0.0 ); glVertex3f( 0.5, 0.5, 0.0 ); glVertex3f( 0.0, 0.5, 0.0 ); ...... glEnd(); 2、采用数组,把数据和代码进行分离:循环实现 // 将立方体的八个顶点保存到一个数组里面 /*static const GLfloat vertex_lists[][3]= { //里面四个顶点 -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f,0.5f,-0.5f, //外面四个顶点 -0.5f,-0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f}; // 将要使用的顶点的序号保存到一个数组里面 static const GLint face_lists[][4]= { 0, 3, 2, 1, 6, 5, 1, 2, 3, 0, 4, 7, 3, 7, 6, 2, 0, 4, 5, 1, 7, 4, 5, 6, };//注意每个面绘制的顺序,背面采用顺时针方向。 glBegin(GL_QUADS); for(int i=0; i<6; ++i) // 有六个面,循环六次 for(int j=0; j<4; ++j) // 每个面有四个顶点,循环四次 glVertex3fv(vertex_lists[face_lists[i][j]]); glEnd(); 3、采用顶点数组:减少函数的调用次数。 //启用顶点数组 glEnableClientState( GL_VERTEX_ARRAY ); //指定顶点数组的位置1、表示每个顶点由(x,y,z)三个分量构成,2、分量的类型,3、数据之间的间隔,4、顶点数组的位置 glVertexPointer( 3, GL_FLOAT, 0, vertex_lists ); //1、绘制的图形类型2、顶点个数3、序号数组内的数据的类型4、序号数组的位置 glDrawElements( GL_QUADS, 24, GL_UNSIGNED_INT, face_lists ); glEnable/glDisable函数与glEnableClientState/glDisableClientState函数的区别:Opengl的工作机制 OpenGL在设计时,认为可以将整个OpenGL系统分为两部分,一部分是客户端,它负责发送OpenGL命令。一部分是服务端,它负责接收OpenGL命令并执行相应的操作。对于个人计算机来说,可以将CPU、内存等硬件,以及用户编写的OpenGL程序看做客户端,而将OpenGL驱动程序、显示设备等看做服务端。 通常,所有的状态都是保存在服务器端的,便于OpenGL使用。例如,是否启用了纹理,服务器端在绘制时经常需要知道这个状态,而我们编写的客户端OpenGL程序只在很少的时候需要知道这个状态。所以将这个状态放在服务端是比较有利的。 但顶点数组的状态则不同。我们指定顶点,实际上就是把顶点数据从客户端发送到服务端。是否启用顶点数组,只是控制发送顶点数据的方式而已。服务端只管接收顶点数据,而不必管顶点数据到底是用哪种方式指定的(可以直接使用glBegin/glEnd/glVertex*,也可以使用顶点数组)。所以,服务端不需要知道顶点数组是否开启。因此,顶点数组的状态放在客户端是比较合理的。 为了表示服务端状态和客户端状态的区别,服务端的状态用glEnable/glDisable,客户端的状态则用glEnableClientState/glDisableClientState |
No comments:
Post a Comment