如果未将Transpose设置为GL_TRUE,则OpenGL / GSL无法正常工作

时间:2018-08-01 06:56:03

标签: opengl game-engine glm-math coordinate-transformation

没有transfom,GLM矩阵似乎无法工作

glm::mat4 proj = glm::ortho(0.0f,960.0f,0.0f,540.0f,-1.0f, 1.0f);

GL_TRUE必须设置:

glUniformMatrix4fv(GetUniformLocation(name),1 ,GL_TRUE,&matrix[0][0])

GLM是否已经假定是列主格式?

1 个答案:

答案 0 :(得分:0)

如果您不想转置矩阵,则必须将着色器代码中的向量从 right 乘以矩阵:

mat4 transformation;
vec4 vertexPosition;

gl_Position = transformation * vertexPosition;

说明

请参见GLSL Programming/Vector and Matrix Operations

  

此外,*运算符可用于相应维度的矩阵向量乘积,例如:

vec2 v = vec2(10., 20.);
mat2 m = mat2(1., 2.,  3., 4.);
vec2 w = m * v; // = vec2(1. * 10. + 3. * 20., 2. * 10. + 4. * 20.)
     

请注意,向量必须从右边乘以矩阵。   

  如果将向量从左侧乘以矩阵,则结果相当于将列向量从右侧乘以转置矩阵。这相当于将列向量从右边乘以转置矩阵:

  因此,从左向矩阵乘以一个向量对应于从右向转置矩阵乘以一个向量:

vec2 v = vec2(10., 20.);
mat2 m = mat2(1., 2.,  3., 4.);
vec2 w = v * m; // = vec2(1. * 10. + 2. * 20., 3. * 10. + 4. * 20.)


这意味着

如果矩阵是这样定义的:

mat4 m44 = mat4(
    vec4( Xx, Xy, Xz, 0.0),
    vec4( Yx, Xy, Yz, 0.0),
    vec4( Zx  Zy  Zz, 0.0),
    vec4( Tx, Ty, Tz, 1.0) );

矩阵统一mat4 transformation的设置如下(请参见glUniformMatrix4fv

glUniformMatrix4fv( .... , 1, GL_FALSE, &(m44[0][0] ); 

然后必须从将向量乘以矩阵:

gl_Position = transformation * vertexPosition;


但是当然可以将矩阵设置为转置

mat4 m44 = mat4(
    vec4(  Xx,  Yx,  Zx,  Tx),
    vec4(  Xy,  Yy,  Zy,  Ty),
    vec4(  Xz   Yz   Zz,  Tz),
    vec4( 0.0, 0.0, 0.0, 1.0) );
设置为统一变量时,

可以转置:

glUniformMatrix4fv( .... , 1, GL_TRUE, &(m44[0][0] );

然后必须将向量从乘以矩阵:

gl_Position = vertexPosition * transformation;

请注意,glm API documentation是指The OpenGL Shading Language specification 4.20