opengl編程指南



第一章 opengl簡介

1.1 什麼是opengl

opengl是圖形硬件的一種軟件接口。

       1>渲染(rendering)是計算機根據模型創建圖像的過程。

2>模型(model)是根據幾何圖元創建的,也成爲物體(object)。

3>幾何圖元包括點、直線、和多邊形等,它們是通過頂點(vertex)指定的。

4>像素是顯示硬件可以在屏幕上顯示的最小可視元素。

5>OpenGL是一個狀態機。

6>OpenGL渲染管線 的一些關鍵階段

1. 顯示列表

任何數據,不論它描述的是幾何圖元還是像素,都可以保存在顯示列表(display list)中,供當前或以後使用。

2. 求值器

所有的幾何圖元最終都要通過頂點來描述。求值器提供了一種方法,根據控制點計算表示表面的頂點。這種方法是一種多項式映射,它可以根據控制點產生表面法線、紋理座標、顏色以及空間座標值。

3. 基於頂點的操作

把頂點變換爲圖元

4. 圖元裝配

圖元裝配的一個主要內容就是裁剪。

5. 像素操作

6. 紋理裝配

OpenGL應用程序可以在幾何物體上應用紋理圖像,使他們看上去更爲逼真。

7. 光柵化

光柵化就是把幾何數據和像素數據轉換爲片段的過程。

8. 片段操作

在數據實際存儲到幀緩衝區之前,要執行一系列的操作(紋理處理、測試等)。

7>處理輸入事件

1. 可以使用下面這些函數註冊一些回調函數,當指定的事件發生時,這些函數便會被調用

glutReshapeFunc(void(*func)(int w, int h)) 表示當窗口的大小發生改變時應該採取什麼行動;

glutKeyboardFunc(void(*func)(unsigned char key, int x, int y))把鍵盤上的一個鍵與一個函數相關聯,當鍵被按下或釋放時函數被調用;

glutMouseFunc(void(*func)(int button, int state, int x, int y))把鼠標上的一個按鈕與一個函數相關聯,當按鈕被按下或釋放時函數被調用;

glutMotionFunc(void(*func)(int x, int y))註冊了一個函數,當按下一個鼠標按鈕移動鼠標時,這個函數就會被調用。

8>空閒處理

glutIdleFunc(void(*func)(void));如果向它傳遞NULL(0),就相當於禁用這個函數。

9>繪製三維物體

圓錐體,立方體、十二面體、二十面體、八面體、球體、茶壺、四面體、圓環面。

10>電影院,每秒24幀 把圖片投影到屏幕

11>OpenGL渲染環境是OpenGL在其中存儲狀態信息的數據結構。

12>模式是特定於應用程序領域的OpenGL功能集的子集。

13>訪問OpenGL函數--找到函數的地址。

範例:

此程序使用了鼠標響應函數和類似重繪的函數。

  1. #include<GL/glut.h>  
  2.   
  3. static GLfloat spin = 0.5;  
  4.   
  5. void init(void)  
  6. {  
  7.     glClearColor(0.0,0.0,0.0,0.0);  
  8.     glShadeModel(GL_FLAT);   //設置着色模式,恆定着色或光滑着色  
  9. }  
  10.   
  11. void display(void)  
  12. {  
  13.     glClear(GL_COLOR_BUFFER_BIT);  
  14.     glPushMatrix();  
  15.     glRotatef(spin,0.0,0.0,1.0);  
  16.     glColor3f(1.0,1.0,1.0);  
  17.     glRectf(-25.0,-25.0,25.0,25.0);  
  18.     glPopMatrix();  
  19.     glutSwapBuffers();  
  20. }  
  21.   
  22. void spinDisplay(void)  
  23. {  
  24.     spin += 2.0;  
  25.     if(spin > 360.0)  
  26.         spin -= 360.0;  
  27.     glutPostRedisplay(); //使每次循環先調用該函數所在函數,然後調用display  
  28. }  
  29.   
  30. void reshape(int w, int h)  
  31. {  
  32.     glViewport(0, 0, (GLsizei)w, (GLsizei)h); //選擇一個所要的繪圖區域  
  33.     glMatrixMode(GL_PROJECTION);  
  34.     glLoadIdentity();  
  35.     glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);  
  36.     glMatrixMode(GL_MODELVIEW);  
  37.     glLoadIdentity();  
  38. }  
  39.   
  40. void mouse(int button, int state, int x, int y)  
  41. {  
  42.     switch(button)  
  43.     {  
  44.         case GLUT_LEFT_BUTTON:  
  45.             if(state == GLUT_DOWN)  
  46.                 glutIdleFunc(spinDisplay);  
  47.             break;  
  48.         case GLUT_MIDDLE_BUTTON:  
  49.             if(state == GLUT_DOWN)  
  50.                 glutIdleFunc(0);  
  51.             break;  
  52.         default:  
  53.             break;  
  54.   
  55.     }  
  56. }  
  57.   
  58. int main(int argc, char** argv)  
  59. {  
  60.     glutInit(&argc, argv);  
  61.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  
  62.     glutInitWindowSize(250,250);  
  63.     glutInitWindowPosition(100,100);  
  64.     glutCreateWindow(argv[0]);  
  65.     init();  
  66.     glutDisplayFunc(display);  
  67.     glutReshapeFunc(reshape);  
  68.     glutMouseFunc(mouse);  
  69.     glutMainLoop();  
  70.     return 0;  
  71. }  
#include<GL/glut.h>

static GLfloat spin = 0.5;

void init(void)
{
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);   //設置着色模式,恆定着色或光滑着色
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glRotatef(spin,0.0,0.0,1.0);
	glColor3f(1.0,1.0,1.0);
	glRectf(-25.0,-25.0,25.0,25.0);
	glPopMatrix();
	glutSwapBuffers();
}

void spinDisplay(void)
{
	spin += 2.0;
	if(spin > 360.0)
		spin -= 360.0;
	glutPostRedisplay(); //使每次循環先調用該函數所在函數,然後調用display
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h); //選擇一個所要的繪圖區域
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
	switch(button)
	{
		case GLUT_LEFT_BUTTON:
			if(state == GLUT_DOWN)
				glutIdleFunc(spinDisplay);
			break;
		case GLUT_MIDDLE_BUTTON:
			if(state == GLUT_DOWN)
				glutIdleFunc(0);
			break;
		default:
			break;

	}
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(250,250);
	glutInitWindowPosition(100,100);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}


第三章 觀察

3.1 觀察點和矩陣的使用

  1. #include<GL/glut.h>  
  2. void init(void)  
  3. {  
  4.     glClearColor(0.0,0.0,0.0,0.0);  
  5.     glShadeModel(GL_FLAT);  
  6. }  
  7.   
  8. void display(void)  
  9. {  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(1.0,0.0,0.0);  
  12.     glLoadIdentity();     //清空矩陣  
  13.     /*   視點變換   */  
  14.     gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);  
  15.     glScalef(1.0,2.0,1.0);  //模型變換  
  16.     glutWireCube(1.0);  
  17.     glFlush();  
  18. }  
  19.   
  20. void reshape(int w, int h)  
  21. {  
  22.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
  23.     glMatrixMode(GL_PROJECTION);  
  24.     glLoadIdentity();  
  25.     glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);  
  26.     glMatrixMode(GL_MODELVIEW);  
  27. }  
  28.   
  29. int main(int argc, char** argv)  
  30. {  
  31.     glutInit(&argc, argv);  
  32.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
  33.     glutInitWindowSize(400,400);  
  34.     glutInitWindowPosition(200,200);  
  35.     glutCreateWindow("study");  
  36.     init();  
  37.     glutDisplayFunc(display);  
  38.     glutReshapeFunc(reshape);  
  39.     glutMainLoop();  
  40.     return 0;  
  41. }  
#include<GL/glut.h>
void init(void)
{
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0,0.0,0.0);
	glLoadIdentity();     //清空矩陣
	/*   視點變換   */
	gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
	glScalef(1.0,2.0,1.0);  //模型變換
	glutWireCube(1.0);
	glFlush();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
	glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(400,400);
	glutInitWindowPosition(200,200);
	glutCreateWindow("study");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}


3.4 GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};

glClipPlane(GL_CLIP_PLANE0, eqn);

glEnable(GL_CLIP_PLANE0);     即可刪除y軸下部分附加載剪面

  1. #include<GL/glut.h>  
  2. void init(void)  
  3. {  
  4.     glClearColor(0.0,0.0,0.0,0.0);  
  5.     glShadeModel(GL_FLAT);  
  6. }  
  7.   
  8. void display(void)  
  9. {  
  10.     GLdouble eqn[4] = {0.0,1.0,0.0,0.0};  
  11.     GLdouble eqn2[4] = {1.0,0.0,0.0,0.0};  
  12.   
  13.     glClear(GL_COLOR_BUFFER_BIT);  
  14.     glColor3f(1.0,1.0,1.0);  
  15.     glPushMatrix();  
  16.     glTranslatef(0.0,0.0,-5.0);  
  17.   
  18.     /* 截掉下半部分(y座標小於0的部分)*/  
  19.     glClipPlane(GL_CLIP_PLANE0,eqn);  
  20.     glEnable(GL_CLIP_PLANE0);  
  21.     /* 截掉下半部分(y座標小於0的部分)*/  
  22.     glClipPlane(GL_CLIP_PLANE1,eqn2);  
  23.     glEnable(GL_CLIP_PLANE1);  
  24.   
  25.     glRotatef(90.0,1.0,0.0,0.0);  
  26.     glutWireSphere(1.0,20,16);  
  27.     glPopMatrix();  
  28.     glFlush();  
  29.       
  30. }  
  31.   
  32. void reshape(int w, int h)  
  33. {  
  34.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
  35.     glMatrixMode(GL_PROJECTION);  
  36.     glLoadIdentity();  
  37.     gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0);  
  38.     glMatrixMode(GL_MODELVIEW);  
  39. }  
  40.   
  41. int main(int argc, char** argv)  
  42. {  
  43.     glutInit(&argc, argv);  
  44.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
  45.     glutInitWindowSize(400,400);  
  46.     glutInitWindowPosition(200,200);  
  47.     glutCreateWindow("study");  
  48.     init();  
  49.     glutDisplayFunc(display);  
  50.     glutReshapeFunc(reshape);  
  51.     glutMainLoop();  
  52.     return 0;  
  53. }  
#include<GL/glut.h>
void init(void)
{
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);
}

void display(void)
{
	GLdouble eqn[4] = {0.0,1.0,0.0,0.0};
	GLdouble eqn2[4] = {1.0,0.0,0.0,0.0};

	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0,1.0,1.0);
	glPushMatrix();
	glTranslatef(0.0,0.0,-5.0);

	/* 截掉下半部分(y座標小於0的部分)*/
	glClipPlane(GL_CLIP_PLANE0,eqn);
	glEnable(GL_CLIP_PLANE0);
	/* 截掉下半部分(y座標小於0的部分)*/
	glClipPlane(GL_CLIP_PLANE1,eqn2);
	glEnable(GL_CLIP_PLANE1);

	glRotatef(90.0,1.0,0.0,0.0);
	glutWireSphere(1.0,20,16);
	glPopMatrix();
	glFlush();
	
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0);
	glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(400,400);
	glutInitWindowPosition(200,200);
	glutCreateWindow("study");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章