一个 GLUT + glDrawElement 的基本范例, 要注意的地方已经有说明. 包括双缓冲需要注意的命令
#include <gl/GLUT.h> float angle=0; GLfloat vertices[]={ 1,1,1, -1,1,1, -1,-1,1, 1,-1,1, 1,1,-1, -1,1,-1, -1,-1,-1, 1,-1,-1 }; //必须为 short 类的数组 short indices[]={ 0,2,3, 0,1,2, 4,5,1, 4,1,0, 4,0,3, 4,3,7, 1,6,2, 1,5,6, 4,6,5, 4,7,6, 2,6,3, 3,6,7 }; GLfloat colors[]={ 0,1,1, 1,0,1, 1,1,0, 0,1,1, 1,0,1, 1,1,0, 0,1,1, 1,0,1 }; void myDisplay(void){ //动画必须刷新 GL_DEPTH_BUFFER_BIT glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*glPushMatrix(); glRotatef(angle,0,1,0); glRectf(-0.5f,-0.5f,0.5f,0.5f); glPopMatrix();*/ glPushMatrix(); glRotatef(angle,0,1,0); glVertexPointer(3,GL_FLOAT,0,vertices); glColorPointer(3,GL_FLOAT,0,colors); //win32 DrawElements 必须用 GL_UNSIGNED_SHORT; //DrawElements 第二个参数是所有需要绘制的三角面的顶点数,即是indices数组的总长, //而非 vertices 数组的总长. glDrawElements(GL_TRIANGLES,36,GL_UNSIGNED_SHORT,indices); glPopMatrix(); //双缓冲开启必须用 glutSwapBuffers(); 而不是 glFlush(); glutSwapBuffers(); angle+=0.01; } void changeSize(int w, int h){ if(h==0){ h=1; } float ratio=(GLfloat)(w/h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(45,ratio,0.1,1000); gluLookAt(0,5,10,0,0,0,0,1,0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char * argv[]){ glutInit(&argc,argv); //在此开启双缓冲 glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow("the first glut program"); glutDisplayFunc(myDisplay); glutIdleFunc(myDisplay); glutReshapeFunc(changeSize); glEnable(GL_DEPTH_TEST); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glutMainLoop(); return 0; }