GLSL齐次变换问题

3

我试图在GLSL中使用一个齐次mat4将由一列vec3表示的点进行变换。该矩阵是沿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轴平移上没有任何影响。希望我只是忽略了一些显而易见的东西。有什么想法吗?
更新:我进行了更多测试,向量*转置矩阵不会给出与矩阵*向量相同的结果。发生了什么?

你在测试哪个GPU?我在Qualcomm Adreno 320上进行矩阵后乘法时得到了一些不好的结果。 - nmr
@nmr 嗯,有一段时间了,但是可能是 GeForce 525M 或 Intel HD 4400 显卡。 - Trillian
1个回答

1

如果在调用transformPoint()之前没有提供有关如何初始化mat4变量的其他信息,我猜测你传递的矩阵很可能是行主序,而glsl中默认的矩阵都是列主序。这就解释了为什么只有在transpose(matrix)之后才能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接