我正在尝试投影点的法线并根据它是否(从相机/观察平面的角度看)倾斜左侧垂直或右侧垂直来着色。
要做到这一点,我将我的观点正常并将其乘以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;
}
答案 0 :(得分:3)
法线是方向,而不是点。这意味着它的w
组件应为0.否则,您最终可能会对其应用翻译,这肯定会弄乱x, y, z
坐标(我想这会发生在你的情况下)。
另请注意,如果您的模型视图矩阵包含旋转和平移以外的任何内容,则法线将再次混乱。它们必须通过逆转置进行转换。反转和转置在仅旋转矩阵上取消,但对于其他转换,您必须使用它们。
并且您可能不希望对它们应用投影 - 您可以在相机坐标中评估您所追求的测试(x
坐标)(通常比投影空间更容易推理)。 / p>