3
我试图在GLSL中将齐列mat4
列vec3
表示的点转换为点。该矩阵是沿x轴简单平移1。我检查是最好的,我所能说的矩阵的确让我着色器这种形式的适当列主要矩阵:GLSL齐次转换问题
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
。这是怎么回事?
你在测试什么GPU?我在Qualcomm Adreno 320做矩阵后置乘法时遇到了一些不好的结果。 – nmr
@nmr嗯,这已经有一段时间了,但它是GeForce 525M或Intel HD 4400 GPU。 – Trillian