天天看點

GLSL ES 語言—矢量和矩陣的指派構造函數矢量構造函數矩陣構造函數

矢量構造函數

GLSL ES 提供了豐富靈活的方式來建立矢量,比如:

//将v3設為(1.0, 0.0, 0.5)vec3 v3 = vec3(1.0, 0.0, 0.5);
//使用v3的前兩個元素,v2為(1.0, 0.0)
vec2 v2 = vec2(v3);
//将v4設為(1.0, 1.0, 1.0, 1.0)
vec4 v4 = vec4(1.0);           

複制

還可以将多個矢量組合成一個矢量,比如:

//将v4設為(1.0, 0.0, 1.0, 1.0)vec4 v4b = vec4(v2, v4);           

複制

這裡的規則是先把第一個參數v2中的所有元素填充進來,如果還未填滿,就繼續用第2個參數v4中的元素填充。

矩陣構造函數

需要注意矩陣中的元素是按照列主序排列的,看下面幾個例子顯示使用了矩陣構造函數的不同方式。

  • 使用矩陣構造函數mat4()傳入每一個元素的數值
mat4 m4 = mat4(1.0,   2.0,    3.0,    4.0,
               5.0,   6.0,    7.0,    8.0,
               9.0,   10.0,  11.0,    12.0,
               13.0,  14.0,  15.0,    16.0);           

複制

對應的矩陣:

GLSL ES 語言—矢量和矩陣的指派構造函數矢量構造函數矩陣構造函數
  • 向矩陣傳入一個或多個矢量,注意它是列主序排列
vec2 v2_1 = vec2(1.0, 3.0); 
vec2 v2_2 = vec2(2.0, 4.0);
mat2 m2_1 = mat2(v2_1, v2_2);           

複制

對應的矩陣:

GLSL ES 語言—矢量和矩陣的指派構造函數矢量構造函數矩陣構造函數
  • 向矩陣構造函數中傳入矢量和數值,同樣按照注列主序傳入
// 使用兩個浮點數和一個vec2
mat2 = mat2(1.0, 3.0, v2_2);           

複制

  • 向矩陣構造函數中傳入單個數值,對角線上元素都是該數值,其它元素為0.0
mat4 m4 = mat4(1.0);           

複制

GLSL ES 語言—矢量和矩陣的指派構造函數矢量構造函數矩陣構造函數

如果傳入的數值元素大于1個,又沒達到矩陣元素的數量就會出錯,如下:

mat4 m4 = mat4(1.0, 2.0, 3.0); // 錯誤,mat4需要16個元素           

複制

GLSL ES 語言—矢量和矩陣的指派構造函數矢量構造函數矩陣構造函數