矩陣的行序和列序存儲
在圖形處理中,矩陣操作時最基本的操作,但是不同的係統中對矩陣的存儲是不同,比如OpenGL和Cg中就是不一樣的:
比如一個4x4矩陣[m11,m12,m13,m14
m21,m22,m23,m24
m31,m32,m33,m34
m41,m42,m43,m44],
在實現中通常將其存儲為一個一維的線性數組如float matrix【16】或者float* matrix。
在opengl中這個matrix中數據的順序是先遍曆列的,線性存儲為{m11,m21,m31,m41,m12,m22,m32......},這被稱為矩陣的列序(column-major)存儲,我們使用GlGetfloatv(GL_MODELVIEW_MATRIX,...)等得到的存儲矩陣的數組都是按照這樣的順序存儲矩陣的。
但是在cg中這個matrix的存儲順序確實先遍曆行的,也就是存儲為{m11,m12,m13,m14,m21,m22,m23,m24,m31,......},稱為行序(row-major)存儲,可能多數人認為這種存儲順序更“自然”,(其實我也這麼覺得),這種存儲方式也被稱為是c-style的,好像是大多數係統裏是按照行序存儲矩陣的。
不同的係統對矩陣的存儲方式不一樣,如果在程序中綜合使用了不同的框架,就要注意進行統一了,比如你在opengl 中使用了CG腳本的時候,例如一個cg程序void programm(uniform float4x4 modelviewMatrix,... ...)要求你從程序中傳入一個modelview矩陣,我們在程序中使用opengl的GlGetfloatv()函數得到了float* glmatrix 為這個modelview矩陣,但是這個glmatrix確不能直接賦給modelviewMatrix供cg使用,因為cg在解析這個glmatrix 會把它解析為行序的,我們可以在讓modelviewMatrix得到glmatrix 後,調用transfor()將modelviewMatrix做一個轉置,modelviewMatrix就變成cg所能正確解析的行序的了。
行序和列序的轉換其實就是一個矩陣的轉置關係,雖然這個變換很簡單,但是在使用不同的框架時,要記得先注意一下這個係統式采用哪種方式存儲矩陣的,才不會犯錯。
最後更新:2017-04-02 03:42:38