2019年4月1日 星期一

矩陣的排列順序(2)

矩陣的排列順序(2)

前言

  在前一篇矩陣的排列順序(1)中,提到了矩陣的排列順序,不過後來發現不是那麼正確,所以在寫一篇來補充。

內容

  在前一篇矩陣的排列順序(1)中有一張比較圖如下
矩陣排列順序比較
在上一篇得到的結論是用"右邊"的排列,但近日實驗了Direct3D、OpenGL、OpenGLES與WebGL後,當使用"右邊"的排列傳入後,乘法的順序如下
 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的矩陣乘法


沒有留言:

張貼留言