我试图用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相同的结果。到底怎么回事?
发布于 2015-03-28 18:40:50
没有关于在调用mat4 ()之前如何初始化transformPoint变量的其他信息。我猜您传递的矩阵很可能是按行的主要顺序排列的,而glsl中的矩阵在默认情况下都是以列为主。这解释了为什么它只能在转置(矩阵)之后工作。
https://stackoverflow.com/questions/20180125
复制相似问题