2014-11-22 54 views
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不会改变这个事实。

+2

第一个版本的长度与1相差多少?如果这是一个非常小的数字,我会猜测这是一个数字问题。你有没有在你的着色器中设置浮点精度? – BDL 2014-11-22 14:46:54

+0

不,这是一个很大的数额。超过0.1 有时甚至超过10甚至更​​多。精度是'精度中等浮动'。 – Kenji 2014-11-22 14:56:50

+1

“u_LightPos”的值和“v_Position”的大致范围是什么?我想知道如果这些值非常大,是否仍然存在精确度问题。如果将精度设置为'highp',是否有任何变化? – 2014-11-22 16:59:19

回答

4

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

相关问题