我正在使用OpenGL ES 2.0在Java中开发Android游戏。目前,我正在编写自己的顶点和片段着色器。我在我的片段着色器中遇到了一个奇怪的问题:
为什么
编辑:这是顶点着色器:
normalize(u_LightPos - v_Position)
与normalize(normalize(u_LightPos - v_Position))
不同,其中u_LightPos
是一个uniform变量,v_Position
是一个varying变量。为什么
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;
}
这里是片段着色器:
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
进行规范化并不能改变这个事实。
u_LightPos
的值是多少,v_Position
的大致范围是多少?如果这些值非常大,是否仍可能存在精度问题?如果将精度设置为highp
,是否会有任何变化? - Reto Koradi