OpenGL Projection / Matrix混淆

时间:2014-02-03 22:52:13

标签: c++ opengl glsl shader

我正在尝试投影点的法线并根据它是否(从相机/观察平面的角度看)倾斜左侧垂直或右侧垂直来着色。

要做到这一点,我将我的观点正常并将其乘以gl_ModelViewProjectionMatrix,并检查它是否具有正x值或负x值。然而,我的所有点都变为红色(表示垂直左侧,绝对不是这样)。如果我将ModelViewProjectionMatrix更改为gl_ProjectionMatrix,我会得到红点和绿点,但是如果没有ModelViewMatrix,它们显然没有从相机的角度着色。

我在这里误解了什么吗?

着色器示例:

void main(){
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    vec4 temp = vec4(vNormal.x, vNormal.y, vNormal.z, 1);
    vMajorTransformed = gl_ModelViewProjectionMatrix * temp;

    if (vMajorTransformed.x < 0) {
        gl_FrontColor = vec4(1, 0, 0, 1);
    } else {
        gl_FrontColor = vec4(0, 1, 0, 1);
    }

    gl_PointSize = 3;
}

1 个答案:

答案 0 :(得分:3)

法线是方向,而不是点。这意味着它的w组件应为0.否则,您最终可能会对其应用翻译,这肯定会弄乱x, y, z坐标(我想这会发生在你的情况下)。

另请注意,如果您的模型视图矩阵包含旋转和平移以外的任何内容,则法线将再次混乱。它们必须通过逆转置进行转换。反转和转置在仅旋转矩阵上取消,但对于其他转换,您必须使用它们。

并且您可能不希望对它们应用投影 - 您可以在相机坐标中评估您所追求的测试(x坐标)(通常比投影空间更容易推理)。 / p>