note-50 CPP GLUT

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

猜你喜欢

转载自julianjulian8.iteye.com/blog/1842087
cpp