Ken*_*nji 3 android opengl-es normalization opengl-es-2.0
我正在使用OpenGL ES 2.0开发Java中的Android游戏。目前,我正在编写自己的顶点和片段着色器。我在片段着色器中遇到了一个怪异的问题:与normalize(u_LightPos - v_Position)是不同的normalize(normalize(u_LightPos - v_Position)),其中u_LightPos是一致且v_Position变化的。
为什么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;
}
Run Code Online (Sandbox Code Playgroud)
这是片段着色器:
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;
}
Run Code Online (Sandbox Code Playgroud)
lightVector如我所测试,如果我不对进行两次归一化,则点积将> 1.1。不,归一化v_Normal不会改变这一事实。
| 归档时间: |
|
| 查看次数: |
794 次 |
| 最近记录: |