2
我正在使用OpenGL ES 2.0在Java中开发安卓游戏。目前我正在编写我自己的顶点和片段着色器。我在片段着色器遇到了一个奇怪的问题:normalize(u_LightPos - v_Position)
是normalize(normalize(u_LightPos - v_Position))
,其中u_LightPos
是统一和v_Position
一个改变不同。Opengl - 为什么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不会改变这个事实。
第一个版本的长度与1相差多少?如果这是一个非常小的数字,我会猜测这是一个数字问题。你有没有在你的着色器中设置浮点精度? – BDL 2014-11-22 14:46:54
不,这是一个很大的数额。超过0.1 有时甚至超过10甚至更多。精度是'精度中等浮动'。 – Kenji 2014-11-22 14:56:50
“u_LightPos”的值和“v_Position”的大致范围是什么?我想知道如果这些值非常大,是否仍然存在精确度问题。如果将精度设置为'highp',是否有任何变化? – 2014-11-22 16:59:19