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

时间:2014-11-22 14:29:14

标签: android opengl-es opengl-es-2.0 normalization

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

为什么规范化不是幂等的?为什么我必须调用它两次以获得一个实际正常(长度为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;
}

这是片段着色器:

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;
}

如果我没有对lightVector进行双重标准化,那么点积将是> 1.1,正如我测试的那样。不,规范化v_Normal并不会改变这一事实。

1 个答案:

答案 0 :(得分:4)

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