矩陣的排列順序(2)
前言
在前一篇矩陣的排列順序(1)中,提到了矩陣的排列順序,不過後來發現不是那麼正確,所以在寫一篇來補充。內容
在前一篇矩陣的排列順序(1)中有一張比較圖如下矩陣排列順序比較 |
WVPMatrix = WorldMatrix * ViewMatrix * ProjectionMatrix
這個順序會與關於Transform的矩陣乘法的順序一致,個人比較喜歡這個順序!
在上一篇說過矩陣在ConstantBuffer與UBO的預設順序的規則,但事實上可以在Shader上來改變順序,在HLSL的改法如下
cbuffer cbTest { float4x4 mat;//default is row_major row_major float4x4 mat_row; column_major float4x4 mat_col; };
在GLSL3以後改法如下
//Set all ubo default layout(column_major) uniform; // uniform uboTest { mat4 mat;//default is column_major layout(row_major) mat_row; layout(column_major) mat_col; }
如果在沒有UBO時透過glUniformMatrix4fv()的參數可以決定順序。
雖說順序可以透過Shader來更改,但查了一下WebGL1.0時的uniformMatrix4fv()並不支援Transpose!但卻有該參數的欄位,這規格的設計非常奇怪,如果需要可以Transpose的話必須自己寫。
最後來說說結論,從繪圖API送矩陣的順序會影響在寫Shader時的乘法順序,如果還要考慮到是否要Transpose的話,右邊的排序不需要做任何轉換,乘法順序與我在數學上的書籍看到的是一樣的,所以我個人較推薦右邊的順序。
參考資料
Interface Block (GLSL)相關文章
矩陣的排列順序(1)關於Transform的矩陣乘法
沒有留言:
張貼留言