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;
}