我正在使用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并不会改变这一事实。
答案 0 :(得分:4)
这是一个精确的问题。将精度设置为highp可以解决问题。 u_LightPos和v_Position相差太大,导致值太大而无法正确规范化。