Opengl正交矩陣 glOrthof 數學原理(轉)

http://blog.sina.com.cn/s/blog_6084f588010192ug.htmlhtml

在opengles1.1中設置正交矩陣只要一個函數調用就能夠了:glOrthof,可是opengles2.0開始,爲了增長渲染靈活性擺脫了固定管道渲染,這樣就須要手動去實現glOrthof所對應的矩陣。編程

在iphone3D 編程一書中給出了這個矩陣的定義:iphone

void RenderingEngine2::ApplyOrtho(float maxX, float maxY) const函數

{3d

    float a = 1.0f / maxX;orm

    float b = 1.0f / maxY;htm

    float ortho[16] = {blog

        a, 0,  0, 0,ip

        0, b,  0, 0,get

        0, 0, -1, 0,

        0, 0,  0, 1

    };

   

    GLintprojectionUniform = glGetUniformLocation(m_simpleProgram, "Projection");

    glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);

}

這個函數用於將3d正交矩陣投影到xy平面,也就是轉換到二維平面,也就是須要舍掉一個緯度。這裏須要舍掉z軸,也就是z軸爲零。

對矩陣分解成四個向量

  float ortho[16] = {

        a, 0,  0, 0,

        0, b,  0, 0,

        0, 0, -1, 0,

        0, 0,  0, 1

};

Ix(a,0,0,0),  Iy(0,b,0,0) , Iz(0,0,-1,0)  ,   Iw(0,0,0,1)

正常狀況投影到xy平面z向量應該爲零,這裏他設置成了-1,有點不解,難道說是說z方向上的裁減範圍,有待進一步研究。對於w了向量,是爲了計算方便,能夠不考慮。

    float a = 1.0f / maxX;

    float b = 1.0f / maxY;

對於a,b由於最終的向量要進行縮放以適應屏幕,因此這裏是對x,y進行縮放的因子(把屏幕寬高理解爲一個單位就好理解了)。

再來看一下對應的頂點着色器文件

const char* SimpleVertexShader = STRINGIFY(

 

attribute vec4 Position;

attribute vec4 SourceColor;

varying vec4DestinationColor;

uniform mat4 Projection;

uniform mat4 Modelview;

 

void main(void)

{

    DestinationColor = SourceColor;

    gl_Position = Projection * Modelview * Position;

}

);

這一行正是對映射到屏幕上點的最終變換

gl_Position = Projection * Modelview * Position;

相關文章
相關標籤/搜索