如果不将 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 将无法工作的主要内容,如果未能解决你的问题,请参考以下文章
使用imageView外观禁用UIButton而不将isEnabled设置为false
有没有办法专注于 DataGrid 的单元格而不将其设置为可编辑?
如何在不将 UIScrollView 的 delaysContentTouches 设置为 NO 的情况下快速点击它时使 UIScrollView 中的按钮突出显示