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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章