3

我正在尝试将由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. 这是怎么回事?

4

1 回答 1

1

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

于 2015-03-28T18:40:50.787 回答