如果不将 Transpose 设置为 GL_TRUE,OpenGL/GSL 将无法工作

Posted

技术标签:

【中文标题】如果不将 Transpose 设置为 GL_TRUE,OpenGL/GSL 将无法工作【英文标题】:OpenGL/GSL not working without setting Transpose to GL_TRUE 【发布时间】:2018-08-01 06:56:03 【问题描述】:

如果没有转换,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】:

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

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) );

或者在设置为uniform变量时可以转置:

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

那么向量必须从left乘以矩阵:

gl_Position = vertexPosition * transformation;

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

【讨论】:

以上是关于如果不将 Transpose 设置为 GL_TRUE,OpenGL/GSL 将无法工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥 delete 不将指针设置为 NULL?

备份数据库而不将其设置为只读

使用imageView外观禁用UIButton而不将isEnabled设置为false

有没有办法专注于 DataGrid 的单元格而不将其设置为可编辑?

如何在不将 UIScrollView 的 delaysContentTouches 设置为 NO 的情况下快速点击它时使 UIScrollView 中的按钮突出显示

即使不将其添加为子视图,设置为 TableViewController 的刷新控件也可以工作