GLSL矩陣變換詳解(一、總述)

按照《OpenGL SuperBible》第四版的描述,OpenGL涉及的變換共4種(ModelView 其實是View和Model的總和,不算單獨的變換):View, Model, Projection, ViewPort。這裏面,Viewport的變換通過glViewport函數完成即可,不涉及GLSL。下面概述View Matrix, Model Matrix, Projection Matrix。


1) Model Matrix

opengl有自己的座標系--世界座標系。座標系的原點位於窗口中心。默認情況下,Y軸指向窗口上方,Z軸垂直於屏幕,指向外面,X軸水平指向屏幕右邊。世界座標系是一個直角座標系。

1.1)物體位置不一定處於世界座標系的中心,而是相對世界座標的原點偏移。這個偏移操作可以用矩陣變換描述。

1.2)除了平移操作之外,物體的還可能經歷旋轉操作、伸縮操作,這兩種操作也可以用矩陣變換描述。

以上操作的任何一種,或者彼此的組合都對應Model Matrix。在下一篇博客裏,我會進一步解釋。

2) View Matrix

View變換的作用是指定攝像機的位置,以及其觀察方向。

3) Projection Matrix

在確定了物體的形狀位置和攝像機的位置以後,最後還要確定攝像機的攝像區域。這由Projection Matrix完成。

此外,按照https://en.wikibooks.org/wiki/GLSL_Programming/Vertex_Transformations 的說法,Projection Matrix之後還有一個“Perspective Division”操作,把物體在世界座標系的座標(3D)轉化爲在設備座標系(NDC)中的座標(2D),當然這是OpenGL自行完成的,操作員不需操心。“These clip coordinates are then transformed to normalized device coordinates by the perspective division, which is just a division of all coordinates by the fourth coordinate. (Normalized device coordinates are named as such because their values are between -1 and +1 for all points in the visible part of the scene.)”

4) 矩陣乘法與標量乘法不同,矩陣乘法講究次序。根據https://en.wikibooks.org/wiki/GLSL_Programming/Vertex_Transformations 的截圖,Model Matrix 最前,View次之,Projection最後。假如物體的座標是(x,y,z,w)或者(r,theta, phi,w)又或者(r, theta, z, w)等等,則這個4維矢量首先與Model Matrix相乘。然後纔是view最後Projection。


GLSL默認矢量是列向量。所以一個4乘4的矩陣只能左乘這個列矢量:


以此類推,View Matrix 只能左乘Model Matrix作用後的結果,而Projection Matrix只能作用View和Model作用後的結果:


以上的三種操作可以通過OpenGL的函數glTranslate glRotate gluLookAt glOrtho glPerspective等來實現。但是這樣開發者看不到底層的具體操作。我個人並不喜歡這樣的操作,而是更傾向於自己生成矩陣,用矩陣直接操作。

在接下來的博客裏,我會利用qt的QMatrix4x4類型矩陣生成對應的Model,View和Projection矩陣,來演示如何實現物體的繪製。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章