第一章 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函數--找到函數的地址。
範例:
此程序使用了鼠標響應函數和類似重繪的函數。
- #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;
- }
#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 觀察點和矩陣的使用
- #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;
- }
#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軸下部分附加載剪面
- #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;
- }
#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;
}