OpenGL - 顶点法线在点光源计算中扮演什么角色?
OpenGL - What role does a vertex normal play in point light calculations?
在逐片段点光照中,顶点法线在点光照计算中起什么作用?
我的理解是片段的亮度完全取决于它与光源的距离,方向矢量是无关紧要的。
示例着色器
precision mediump float;
uniform vec3 u_LightPos;
varying vec3 v_Position;
varying vec4 v_Color;
varying vec3 v_Normal;
void main()
{
float distance = length(u_LightPos - v_Position);
vec3 lightVector = normalize(u_LightPos - v_Position);
float diffuse = max(dot(v_Normal, lightVector), 0.1);
diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
gl_FragColor = v_Color * diffuse;
}
您似乎在使用朗伯漫射照明。在这种情况下,表面亮度与入射光强度(等式中的平方反比项)以及表面法线与入射光方向之间夹角的余弦(等式中的点积)成正比).
经过深思熟虑,这很有意义。考虑两个极端:你会认为一张纸垂直于手电筒的光束比平行于光束的纸看起来更亮。
有关详细信息,请参阅相关维基百科页面的 this section。
在逐片段点光照中,顶点法线在点光照计算中起什么作用?
我的理解是片段的亮度完全取决于它与光源的距离,方向矢量是无关紧要的。
示例着色器
precision mediump float;
uniform vec3 u_LightPos;
varying vec3 v_Position;
varying vec4 v_Color;
varying vec3 v_Normal;
void main()
{
float distance = length(u_LightPos - v_Position);
vec3 lightVector = normalize(u_LightPos - v_Position);
float diffuse = max(dot(v_Normal, lightVector), 0.1);
diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
gl_FragColor = v_Color * diffuse;
}
您似乎在使用朗伯漫射照明。在这种情况下,表面亮度与入射光强度(等式中的平方反比项)以及表面法线与入射光方向之间夹角的余弦(等式中的点积)成正比).
经过深思熟虑,这很有意义。考虑两个极端:你会认为一张纸垂直于手电筒的光束比平行于光束的纸看起来更亮。
有关详细信息,请参阅相关维基百科页面的 this section。