OpenGL-为什么normalize()不是幂等的?

Ken*_*nji 3 android opengl-es normalization opengl-es-2.0

我正在使用OpenGL ES 2.0开发Java中的Android游戏。目前,我正在编写自己的顶点和片段着色器。我在片段着色器中遇到了一个怪异的问题:与normalize(u_LightPos - v_Position)不同normalize(normalize(u_LightPos - v_Position)),其中u_LightPos是一致且v_Position变化的。

为什么normalize()不等幂?为什么必须调用两次才能获得实际的法线(长度1)矢量?这非常令人困惑。

编辑:

这是顶点着色器:

uniform mat4 u_MVPMatrix;
uniform mat4 u_MVMatrix;
attribute vec4 a_Position;
attribute vec3 a_Normal;
varying vec3 v_Position;
varying vec3 v_Normal;
void main() {
    v_Position = vec3(u_MVMatrix * a_Position);
    v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));
    gl_Position = u_MVPMatrix * a_Position;
}
Run Code Online (Sandbox Code Playgroud)

这是片段着色器:

precision mediump float;
uniform vec3 u_LightPos;
uniform vec4 u_Color;
varying vec3 v_Position;
varying vec3 v_Normal;
void main() {
    float distance = length(u_LightPos - v_Position);
    vec3 lightVector = normalize(normalize(u_LightPos - v_Position));
    float diffuse = max(dot(v_Normal, lightVector), 0.0);
    gl_FragColor = u_Color * diffuse;
}
Run Code Online (Sandbox Code Playgroud)

lightVector如我所测试,如果我不对进行两次归一化,则点积将> 1.1。不,归一化v_Normal不会改变这一事实。

Ken*_*nji 5

这是一个精度问题。将精度设置为高可解决此问题。u_LightPos和v_Position相差太大,导致值太大而无法正确归一化。