從零開始學opengl,這裡對學習過程作記錄,包括學習資料,內容,基本知識。
學習資料: opengl es 2.0 for android,網路
內容:1 基本概念
frustum(視錐體),focal point(視點或觀察者位置),field of vision(視野)
目前看起來只能理解個大概,深入理解推導過程不太現實,後面積累足夠再理解。
(參考)
2 矩陣變換的過程與目的
上面基本概念都是用來進行矩陣變換使用的,上圖描繪的是透視投影。個人理解,可以從結果來看,結果就是從我們的人眼看到手機螢幕的內容,就和上圖從相機視角看過去一樣,而儘管手機螢幕是個二維的面,但實際在螢幕中展現的是乙個三維的物體,之所以能夠讓人覺得它是三維的(實際還是個二維的圖形),主要還是因為它的繪製方式是仿照的真實三維世界,仿製的方式就是通過投影,而這說白了也就是對人眼的欺騙。
如何欺騙?在三維世界中,存在遠近的物體,越近就越大,越遠就越小,而且越近的物體越能佔滿眼睛的視角,越遠的物體越趨近於視角中心那個點。將乙個物體仿製到手機螢幕裡也是一樣,把螢幕想象成x與y的座標系,螢幕中心點為(0,0),x軸與y軸把螢幕劃分為4個象限,中心點右邊和上邊為正,中心點左邊和下邊為負,而z軸就從螢幕朝外的方向延伸出來。那麼乙個三維物體通過投影在螢幕上,就是將乙個物體中多個三維座標位置轉換到螢幕中二維座標位置的過程。
其轉換方式就是通過乙個個矩陣與頂點座標相乘得到實際在螢幕上應該展現的座標位置。
比如資料中關於這幾句話的意義:
@override public void onsu***cechanged(gl10 gl, int width, int height)
perspectivem方法就是建立乙個投影矩陣,其作用就是為了改變vertex shader中的gl_position為三維座標位置。它的構建有公式:
構建**:
public static void perspectivem(float m, float yfovindegrees, float aspect, float n, float f)
比如計算視距,就是從相機處到第乙個面的距離,是通過視角在y軸的角度運用三角函式計算得到這個距離。為何要這樣構建目前還不清楚,但這樣拿到的透視矩陣可以當做是乙個工具,用它來乘以頂點上的乙個點就可以得到透視在螢幕上的點。
而**後面建立modelmatrix這個矩陣也是如此,先將其變成單位矩陣,然後往螢幕裡面移動2.5個單位,再沿著x軸朝里旋轉60度,最後兩者相乘拿到的結果。
最後:
uniform mat4 u_matrix;
attribute vec4 a_position;
attribute vec4 a_color;
varying vec4 v_color;
void main()
可以看到得到的矩陣被傳進shader與最初的頂點座標相乘。而實際上就是在最初頂點座標的基礎上對它進行了一系列的變換得到最終值。其意義就是將這個物體所有二維平面的點通過一系列的矩陣操作變換成三維座標。目前對矩陣的操作的選擇和構建還有不少疑問。 透視
透視除法
投影矩陣
座標變換
OpenGL ES 2 0 渲染管線 學習筆記
圖中vertex shader和fragment shader 是可程式設計管線 vertex array buffer objects 頂點資料 這時渲染管線的頂點輸入,通常使用 buffer objects效率更好。vertex shader 頂點著色器通過矩陣變換位置 計算照明公式來生成逐頂點...
openGL ES 2 0開發流程
一 新增必須的framework 框架 opengles.frameworks和quartzcore.framework 二 修改openglview.h 引入opengl的header,建立一些後面會用到的例項變數 caeagllayer eagllayer eaglcontext context...
OpenGL ES 2 0基本概念
1.opengl es 2.0可程式設計管道 上圖黃色部分 vertex shader和fragment shader 為此管道的可程式設計部分。整個管道包含以下兩個規範 1 opengl es 2.0 api specification 2 opengl es shading language s...