GLUT库(v1.1):http://files.cnblogs.com/hcbin/glutdlls37beta.zip
//
注:本人使用VS2008创建此程序
// 新建Win32控制台程序->空程序(Win32 Console Application->An Empty Project)
/*
glGenLists(i):自动分配没有使用的编号(返回的是编号中最小的一个,如果函数返回零,表示分配失败)
glIsList:判断一个编号是否已经被用作显示列表。
创建显示列表:
glNewList(list, GL_COMPILE);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glEnd();
注意:1.显示列表只能装入OpenGL函数
2.不能装入其它内容,如if
3.如装入OpenGL的函数带有返回值都不能装入,glCallList和glCallLists函数都不知道如何处理这些返回值。
4.在网络方式下,设置客户端状态的函数也无法被装入到显示列表,这是因为显示列表被保存到服务器端,各种设置客户端状态的函数在发送到服务器端以前就被执行了,而服务器端无法执行这些函数。
5.分配、创建、删除显示列表的动作也无法被装入到另一个显示列表,但调用显示列表的动作则可以被装入到另一个显示列表。
调用显示列表:
GLuint lists[] = {1, 3, 4, 8};
glListBase(10); //偏移量,实际上调用的是编号为11, 13, 14, 18的四个显示列表
glCallLists(4, GL_UNSIGNED_INT, lists); //调用一系列的显示列表;在使用该函数前需要用glListBase函数
//第一个参数表示了要调用多少个显示列表。
//第二个参数表示了这些显示列表的编号的储存格式,可以是
GL_BYTE(每个编号用一个GLbyte表示)
GL_UNSIGNED_BYTE(每个编号用一个GLubyte表示)
GL_SHORT
GL_UNSIGNED_SHORT
GL_INT
GL_UNSIGNED_INT,GL_FLOAT
//第三个参数表示了这些显示列表的编号所在的位置。
//注:“调用显示列表”这个动作本身也可以被装在另一个显示列表中。
//要调用编号为10的显示列表,直接使用glCallList(10);就可以了
销毁显示列表:
使用glDeleteLists(20, 4);将销毁20,21,22,23这四个显示列表。
*/
#include < math.h >
#include < GL / glut.h >
#define ColoredVertex(c,v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
GLfloat angle = 0.0f ;
void RevolveTriangle(){
static int list = 0 ;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (list == 0 ){ // 如果显示列表不存在,则创建
GLfloat PointA[] = { 0.5f , - sqrt( 6.0f ) / 12 , - sqrt( 3.0f ) / 6 }, // 设置4个角的位置
PointB[] = { - 0.5f , - sqrt( 6.0f ) / 12 , - sqrt( 3.0f ) / 6 },
PointC[] = { 0.0f , - sqrt( 6.0f ) / 12 , sqrt( 3.0f ) / 3 },
PointD[] = { 0.0f , sqrt( 6.0f ) / 4 , 0 };
GLfloat ColorR[] = { 1 , 0 , 0 }, // 设置4个角的颜色
ColorG[] = { 0 , 1 , 0 },
ColorB[] = { 0 , 0 , 1 },
ColorY[] = { 1 , 1 , 0 };
list = glGenLists( 1 );
glNewList(list,GL_COMPILE);
glBegin(GL_TRIANGLES); // 画出4个三角形
// 平面BAD(左)
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorY,PointD);
// 平面ABC(正)
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorB,PointC);
// 平面ACD(右)
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
// 平面CBD(底)
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorY,PointD);
glEnd();
glEndList();
}
// 已经创建了显示列表,在每次绘制正四面体时将调用它
glPushMatrix(); // 入矩阵栈
glRotatef(angle, 1 , 0.5 , 0 ); // 旋转
glCallList(list); // 调用列表
glPopMatrix(); // 出矩阵栈
glutSwapBuffers();
}
void action(){
if (angle >= 360.0f ){
angle = 0.0f ;
}
angle ++ ;
RevolveTriangle();
}
int main( int argc, char * argv[]){
glutInit( & argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition( 200 , 200 );
glutInitWindowSize( 640 , 480 );
glutCreateWindow( " Revolve Triangle " );
glutDisplayFunc( & RevolveTriangle);
glutIdleFunc( & action);
glutMainLoop();
return 0 ;
}
// 新建Win32控制台程序->空程序(Win32 Console Application->An Empty Project)
/*
glGenLists(i):自动分配没有使用的编号(返回的是编号中最小的一个,如果函数返回零,表示分配失败)
glIsList:判断一个编号是否已经被用作显示列表。
创建显示列表:
glNewList(list, GL_COMPILE);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glEnd();
注意:1.显示列表只能装入OpenGL函数
2.不能装入其它内容,如if
3.如装入OpenGL的函数带有返回值都不能装入,glCallList和glCallLists函数都不知道如何处理这些返回值。
4.在网络方式下,设置客户端状态的函数也无法被装入到显示列表,这是因为显示列表被保存到服务器端,各种设置客户端状态的函数在发送到服务器端以前就被执行了,而服务器端无法执行这些函数。
5.分配、创建、删除显示列表的动作也无法被装入到另一个显示列表,但调用显示列表的动作则可以被装入到另一个显示列表。
调用显示列表:
GLuint lists[] = {1, 3, 4, 8};
glListBase(10); //偏移量,实际上调用的是编号为11, 13, 14, 18的四个显示列表
glCallLists(4, GL_UNSIGNED_INT, lists); //调用一系列的显示列表;在使用该函数前需要用glListBase函数
//第一个参数表示了要调用多少个显示列表。
//第二个参数表示了这些显示列表的编号的储存格式,可以是
GL_BYTE(每个编号用一个GLbyte表示)
GL_UNSIGNED_BYTE(每个编号用一个GLubyte表示)
GL_SHORT
GL_UNSIGNED_SHORT
GL_INT
GL_UNSIGNED_INT,GL_FLOAT
//第三个参数表示了这些显示列表的编号所在的位置。
//注:“调用显示列表”这个动作本身也可以被装在另一个显示列表中。
//要调用编号为10的显示列表,直接使用glCallList(10);就可以了
销毁显示列表:
使用glDeleteLists(20, 4);将销毁20,21,22,23这四个显示列表。
*/
#include < math.h >
#include < GL / glut.h >
#define ColoredVertex(c,v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
GLfloat angle = 0.0f ;
void RevolveTriangle(){
static int list = 0 ;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (list == 0 ){ // 如果显示列表不存在,则创建
GLfloat PointA[] = { 0.5f , - sqrt( 6.0f ) / 12 , - sqrt( 3.0f ) / 6 }, // 设置4个角的位置
PointB[] = { - 0.5f , - sqrt( 6.0f ) / 12 , - sqrt( 3.0f ) / 6 },
PointC[] = { 0.0f , - sqrt( 6.0f ) / 12 , sqrt( 3.0f ) / 3 },
PointD[] = { 0.0f , sqrt( 6.0f ) / 4 , 0 };
GLfloat ColorR[] = { 1 , 0 , 0 }, // 设置4个角的颜色
ColorG[] = { 0 , 1 , 0 },
ColorB[] = { 0 , 0 , 1 },
ColorY[] = { 1 , 1 , 0 };
list = glGenLists( 1 );
glNewList(list,GL_COMPILE);
glBegin(GL_TRIANGLES); // 画出4个三角形
// 平面BAD(左)
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorY,PointD);
// 平面ABC(正)
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorB,PointC);
// 平面ACD(右)
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
// 平面CBD(底)
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorY,PointD);
glEnd();
glEndList();
}
// 已经创建了显示列表,在每次绘制正四面体时将调用它
glPushMatrix(); // 入矩阵栈
glRotatef(angle, 1 , 0.5 , 0 ); // 旋转
glCallList(list); // 调用列表
glPopMatrix(); // 出矩阵栈
glutSwapBuffers();
}
void action(){
if (angle >= 360.0f ){
angle = 0.0f ;
}
angle ++ ;
RevolveTriangle();
}
int main( int argc, char * argv[]){
glutInit( & argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition( 200 , 200 );
glutInitWindowSize( 640 , 480 );
glutCreateWindow( " Revolve Triangle " );
glutDisplayFunc( & RevolveTriangle);
glutIdleFunc( & action);
glutMainLoop();
return 0 ;
}