2013年5月16日 星期四

關於 OpenGL 和 D3D 的 major matrix

在許久以來的傳說...

OpenGL 採用如下的的矩陣運算,把它的矩陣稱作 colum matrices

     m11 m12 m13 m14  x
     m21 m22 m23 m24  y
     m31 m32 m33 m34  z
     m41 m42 m43 m44  1

而 D3D 採用如下的的矩陣運算,把它的矩陣稱作 row matrices
            m11 m12 m13 m14

       m21 m22 m23 m24
 x y z 1
       m31 m32 m33 m34

       m41 m42 m43 m44

但那是一個錯誤,那只能說是 "數學" 上的格式,實際上在程式記億體上的儲存方式如下...


OpenGL 採用如下的的矩陣儲存,它稱作 colum major matrices

float M[16] ={m11, m21, m31, m41,
              m12, m22, m32, m42,
              m13, m23, m33, m43,
              m14, m24, m34, m44};

D3D 採用如下的的矩陣儲存,它稱作 row major matrices

float M[16] ={m11, m12, m13, m14,
              m21, m22, m23, m24,
              m31, m32, m33, m34,
              m41, m42, m43, m44};

請睜大眼睛看清楚,這麼一搞 OpenGL 和 D3D 的 Matrix 不就是一樣的東西,那些 colum major 和 row major 根本就是瞎扯蛋,衝其量只能算是記憶體的陣列對 "數學" 上矩陣的不同排列方式,是如何的選取佈局。

所以你也可以說 OpenGL 是 row major matrices :),但正確的說法是不管是 OpenGL 或 D3D 都不存在 major matrix 的問題,那是 陣列 對 數學矩陣 的選取問題。

資料來源 http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html






1 則留言:

  1. 大大翻譯的沒錯!

    不過在表示 scale , rotation and translation 矩陣的時候 就會適用 到 major matrices 這個美麗的錯誤 也造成相吻合的情況 ~ 囧

    寫程式碼的時候 意外相符 .... 事實上歸根究柢就是 row matrix 跟 column matrix 所決定的..

    回覆刪除