我正在尝试在GLSL中将列vec3
表示的点转换为同类mat4
。矩阵是沿x轴的1的简单平移。我尽可能地检查了矩阵确实使它成为我的着色器,作为这种形式的适当的列主要矩阵:
1 0 0 1
0 1 0 0
0 0 1 0
0 0 0 1
我首先尝试(matrix * vec4(point, 1)).xyz
,但是我没有看到翻译在我的场景中的效果。在某种程度上,出于绝望,我以不同的方式重新实现了这种转变,这种方式与我相当,并找到了一种能够实现我想要的方式。但是,我无法弄清楚为什么只有那个有效:
#version 140
vec3 transformPoint(vec3 point, mat4 matrix)
{
return (matrix * vec4(point, 1)).xyz;
return mat3(matrix[0].xyz, matrix[1].xyz, matrix[2].xyz) * point
+ matrix[3].xyz;
return matrix[0].xyz * point.x
+ matrix[1].xyz * point.y
+ matrix[2].xyz * point.z
+ matrix[3].xyz;
// This works, but is not a full transformation
return point + matrix[3].xyz;
// Only this one works
matrix = transpose(matrix);
return vec3(
dot(matrix[0], vec4(point, 1)),
dot(matrix[1], vec4(point, 1)),
dot(matrix[2], vec4(point, 1)));
}
奇怪的是,如果我使用Y翻译,则非工作转换会产生影响,但在X翻译时则不会产生影响。
我希望我只是忽略了一些显而易见的事情。有什么想法吗?
更新:
我已经完成了一些测试,而vector * transpose(matrix)
没有提供与matrix * vector
相同的结果。发生了什么事?
答案 0 :(得分:1)
在调用transformPoint()之前,没有关于如何初始化mat4变量的其他信息。我猜你传入的矩阵很可能是行主要顺序,而默认情况下glsl中的矩阵都是列主要的。这解释了为什么它只能在转置(矩阵)后才能工作。