Friday, May 13, 2011

1、立方体的绘制:顶点,顶点数组 2、关于glEnalbe/glDisalbe和glEanbleClientState的细节

1、立方体的绘制:顶点,顶点数组
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 );   


2:关于glEnalbe/glDisalbe和glEanbleClientState的细节

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