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;