LearningOpenGL

OpenGL安装

下载按说明挪下文件即可:下载地址

Tips

OpenGl是一个状态机,可以设置各种状态,然后这种状态会一直生效,直到再次修改他们。

清除绘制窗口

glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);

glClear()中可选择参数。颜色缓冲区,深度缓冲区,累计缓冲区,模板缓冲区。
在这里插入图片描述

指定着色模式

glShadeModel(GLenum mode);

设置着色模式,mode可选GL_SMOOTH或GL_FLAT。

常见错误

在这里插入图片描述
后来查看是因为glut.h中包含了gl.h,glu.h,包含所有这三个文件没有必要;
而且glut.h要保证在gl.h,glu.h之前。为了保证GLUT程序的可移植性,glut.h包含后,就不要在包含gl.h,glu.h了。修改后无错误消失。
在这里插入图片描述
Some 函数:

两种着色模式:平滑着色与单调着色:

(1)平滑着色:glShadeModel(GL_SMOOTH)平滑着色可以实现一种颜色到另一种颜色的平滑渐变。

(2)单调着色:glShadeModel(GL_FLAT)单调着色即GL_FLAT,单调着色表示图元在内部不进行计算。一般而言,使用单调着色,图元的内部颜色就是最后一个项点所指定的颜色。唯一例外的是GL_POLYGON( 多边形 )图元,它的内部颜色是第一个顶点的颜色。

简单小程序

/*鸟笼*/

#include<GL/freeglut.h>

int angle=1;

void init(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glShadeModel(GL_FLAT);
}
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.5, 0.5);
	glPushMatrix();
	glRotatef((GLfloat)angle, 0.0, 1.0, 0.0);
	glPushMatrix();
	glRotatef(90, 1.0, 0.0, 0.0);
	glutWireCylinder(2.5, 5, 40, 5);
	glPopMatrix();
	glColor3f(0.0, 0.5, 0.5);
	glPushMatrix();
	glRotatef(-90, 1.0, 0.0, 0.0);//设置锥体角朝上
	glutWireCone(2.5, 2.5, 40, 5);
	glPopMatrix();
	glColor3f(0.0, 0.5, 0.5);
	glPushMatrix();
	glRotatef(-90, 1.0, 0.0, 0.0);
	glTranslatef(0.0, 0.0,2.5);
	glScalef(0.1, 0.05, 1);
	glutWireCube(2.0);
	glPopMatrix();

	glPopMatrix();
	glutSwapBuffers();
}
void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(65.0, (GLfloat)w / (GLfloat)h, 1.0, 50.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(0.0, 0.0, -5.0);
	gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void keyboard(unsigned char key, int x, int y)
{
	switch (key) {
		case 'r': /* 按r旋转 */
			angle = (angle + 5) % 360;
			glutPostRedisplay();
			break;
		default:
			break;
	}
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(500, 500);
	glutInitWindowPosition(100, 100);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMainLoop();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章