OpenGL渲染管線分爲兩大部分,模型觀測變換(ModelView Transformation)和投影變換(Projection Transformation)。做個比喻,計算機圖形開發就像我們照相一樣,目的就是把真實的場景在一張照相紙上表現出來。那麼觀測變換的過程就像是我們擺設相機的位置,選擇好要照的物體,擺好物體的造型。而投影變換就像相機把真實的三維場景顯示在相紙上一樣。
讓我們先來弄清楚OpenGL中的渲染管線。管線是一個抽象的概念,之所以稱之爲管線是因爲顯卡在處理數據的時候是按照一個固定的順序來的,而且嚴格按照這個順序。就像水從一根管子的一端流到另一端,這個順序是不能打破的。渲染管線如下圖所示:
OpenGL中渲染管線的步驟也可以用下圖來描述:
其順序依次爲(和照相機比喻):
1、把照相機固定在三腳架上,並對準場景(視圖變換)。
2、對場景鏡像安排,使各個物體在照片中得位置是我們所希望的(模型變換)。
3、選擇相機鏡頭,並調整放大倍數(投影變換)。
4、確定最終照片的大小(視口變換)。
一、視圖變換:
相當於把照相機固定在三腳架上並使它對準場景。void gluLookAt(GLdouble eyeX , GLdouble eyeY , GLdouble eyeZ , GLdouble
centerX , GLdouble centerY , GLdouble centerZ , GLdouble upX , GLdouble upY , GLdouble upZ );
其參數分別表示眼睛位置、瞄向、以及哪個方向是朝上的。
二、模型變換:
其目的是設置模型的位置和方向。
void glScalef(GLfloat x, GLfloat y, GLfloat z);進行縮放。參數指定了在上那個方向上的縮放情況。
void glTranslatef(GLfloat x, GLfloat y, GLfloat z);移動模型。
void glRotatef(GLfloat angle, GLfloat x,GLfloat y,GLfloat z)指定按照從原點到點(x,y,z)的直線進行旋轉的角度。
三、投影變換:
目的是確定視野,確定哪些物體應該位於視野之內以及他們被看到的程度。
分爲透視投影和正交投影。
(1)透視投影:
void glFrustum(GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);
參數分別指定了垂直裁剪平面的左右位置、水平裁剪平面的上下位置以及相機離深度裁剪平面的近、遠距離。
glFrustrum定義了一個平截頭體,它計算一個用於實現透視投影的矩陣,並把它與當前的投影矩陣(一般爲單位矩陣)相乘。
注意:平截頭體並不要求一定是對稱的,它的軸也不需要與Z軸對齊。
glFrustrum使用起來不是很直觀,我們可以用OpenGL工具函數庫的gluPerspective函數。
參數fovy表示眼睛張開的角度。aspect表示縱橫比x/y。zNear和zFar分別表示觀察者離近遠裁剪平面的距離。
注意:gluPerspective僅限於創建沿視線方向同時對稱與x軸和y軸的平截頭體。但是我們通常所需要的也就是這種平截頭體。
(2)正投影
void glOrtho( GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);
創建一個正交平行的視景體。參數和glFrustrum一樣。
如果是把二維圖像投影到二維屏幕這種情況,可以使用OpenGL工具函數庫中的gluOrtho2D函數。它與它的三維版本glOrtho基本相同。
四、視口變換:
決定了場景所映射的有效屏幕區域的形狀。
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
設置視口及像素將要顯示的區域。參數分別指定窗口內部有效屏幕空間的原點(注意(0,0)表示窗口的左下角)以及有效屏幕區域的寬度和高度。
Reference:http://blog.csdn.net/xiajun07061225/article/details/7330565