2013-11-24 56 views
3

我试图在GLSL中将齐列mat4vec3表示的点转换为点。该矩阵是沿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。这是怎么回事?

+0

你在测试什么GPU?我在Qualcomm Adreno 320做矩阵后置乘法时遇到了一些不好的结果。 – nmr

+0

@nmr嗯,这已经有一段时间了,但它是GeForce 525M或Intel HD 4400 GPU。 – Trillian

回答

1

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