2014-11-22 30 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相差太大,導致值太大而無法正常標準化。

相關問題