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