GLSLの行列の使い方

glsl-matrix.png

シェーダ内における行列の初期化

mat3 theMatrix;
theMatrix[1] = vec3(3.0, 3.0, 3.0); //Sets the second column to all 3.0s
theMatrix[2][0] = 16.0; //Sets the first entry of the third column to 16.0.
mat3 theMatrix;
theMatrix[1].yzx = vec3(3.0, 1.0, 2.0);

コンストラクタ

mat2(
  float, float,   //first column
  float, float);  //second column
 
mat4(
  vec4,           //first column
  vec4,           //second column
  vec4,           //third column
  vec4);          //fourth column
 
mat3(
  vec2, float,    //first column
  vec2, float,    //second column
  vec2, float);   //third column
mat3 diagMatrix = mat3(5.0);  //対角線分がすべて 5.0 で埋まった行列が返る
 mat4 otherMatrix = mat4(diagMatrix);

行列成分へアクセスする

mat3 m = mat3(
   1.1, 2.1, 3.1, // first column 
   1.2, 2.2, 3.2, // second column
   1.3, 2.3, 3.3  // third column
);
vec3 column3 = m[2]; // = vec3(1.3, 2.3, 3.3)
float m20 = m[2][0]; // = 1.3
float m21 = m[2].y; // = 2.3

行列の掛け算

行列とベクトルの掛け算

vec4 v, ;
mat4 m;
v * m; //行ベクトルと行列の掛け算 
m * v; //行列と列ベクトルの掛け算

シェーダへ行列を渡す方法

(1)
\begin{align} \left( \begin{array}{ccc} a00 & a01\\ a10 & a11\\ \end{array} \right) \end{align}

こういう行列を渡したい場合

//データの並び順
struct Ellipse{
 float a00,a10,a01,a11
};//列優先に並べる
glUniformMatrix2fv(mEllipseLocation, 1, GL_FALSE, &_ellipse.a00);//2x2行列

4x4行列の渡し方
glUniformMatrix4fv(mMatrixLocation, 1, GL_FALSE, &_matrix[0][0]);//4x4行列

matrix

サポートサイト Wikidot.com matrix