GLSL同质转换问题

时间:2013-11-24 19:50:53

标签: vector matrix glsl homogenous-transformation

我正在尝试在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相同的结果。发生了什么事?

1 个答案:

答案 0 :(得分:1)

在调用transformPoint()之前,没有关于如何初始化mat4变量的其他信息。我猜你传入的矩阵很可能是行主要顺序,而默认情况下glsl中的矩阵都是列主要的。这解释了为什么它只能在转置(矩阵)后才能工作。