1. 程式人生 > >OpenGl基礎繪製二

OpenGl基礎繪製二

渲染圖形的基本流程

 1.建立GLSurfaceView
 2.初始化渲染器
 3.onSurfaceCreated(),onSurfaceChanged(),onDrawFrame()三個方法
 4.著色器(頂點著色器,片元著色器)
 5.頂點 顏色 紋理
 6.繪製
  1. 投影

    OpenGL中只提供了兩種投影方式:

    一種是正射投影,另一種是透視投影
    正射投影(Orthographic Projection):沒有遠小近大效果
    
    正射投影,又叫平行投影。這種投影的視景體是一個矩形的平行管道,也就是一個長方體,如圖所示。正射投影的最大一個特點是無論物體距離相機多遠,投影后的物體大小尺寸不變。這種投影通常用在建築藍圖繪製和計算機輔助設計等方面,這些行業要求投影后的物體尺寸及相互間的角度不變,以便施工或製造時物體比例大小正確。此種模式下,不需要設定照相機位置、方向以及視點的位置,也就是說不需要gluLookAt函式。
    OpenGL正射投影函式共有兩個。
    一個函式是:
    void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far)
    它建立一個平行視景體。實際上這個函式的操作是建立一個正射投影矩陣,並且用這個矩陣乘以當前矩陣。其中近裁剪平面是一個矩形,矩形左下角點三維空間座標是(left,bottom,-near),右上角點是(right,top,-near);遠裁剪平面也是一個矩形,左下角點空間座標是(left,bottom,-far),右上角點是(right,top,-far)。所有的near和far值同時為正或同時為負。如果沒有其他變換,正射投影的方向平行於Z軸,且視點朝向Z負軸。這意味著物體在視點前面時far和near都為負值,物體在視點後面時far和near都為正值。
    另一個函式是:
    void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
    它是一個特殊的正射投影函式,主要用於二維影象到二維螢幕上的投影。它的near和far預設值分別為-1.0和1.0,所有二維物體的Z座標都為0.0。因此它的裁剪面是一個左下角點為(left,bottom)、右上角點為(right,top)的矩形。
    
    2 透視投影(Perspective Projection):大部分3D遊戲用的都是 近大遠小效果
    透視投影符合人們心理習慣,即離視點近的物體大,離視點遠的物體小,遠到極點即為消失,成為滅點。它的視景體類似於一個頂部和底部都被切除掉的稜椎,也就是稜臺。這個投影通常用於動畫、視覺模擬以及其它許多具有真實性反映的方面。OpenGL透視投影函式也有兩個,其中函式glFrustum()。
    此種情況下,需要用gluLookAt設定照相機位置、照相機方向(一般設定為(0,1,0))、以及視點位置。
    這個函式原型為:
    void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far);
    它建立一個透視視景體。其操作是建立一個透視投影矩陣,並且用這個矩陣乘以當前矩陣。這個函式的引數只定義近裁剪平面的左下角點和右上角點的三維空間座標,即(left,bottom,-near)和(right,top,-near);最後一個引數far是遠裁剪平面的Z負值,其左下角點和右上角點空間座標由函式根據透視投影原理自動生成。near和far表示離視點的遠近,它們總為正值。
    另一個函式是:
    void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
    它也建立一個對稱透視視景體,但它的引數定義於前面的不同,如圖所示。其操作是建立一個對稱的透視投影矩陣,並且用這個矩陣乘以當前矩陣。引數fovy定義視野在X-Z平面的角度,範圍是[0.0,180.0];引數aspect是投影平面寬度與高度的比率;引數zNear和Far分別是遠近裁剪面到眼睛的距離,它們總為正值。
    

正射投影如下
正射投影
射透投影如下
這裡寫圖片描述

這裡寫圖片描述
2. 座標變換
3. 繪製函式之間的區別
4. GLSL語言繪製三角形