散射光(Diffuse):
从物体表面向全方位360度均匀反射的光,反射后的散射光在各个方向是均匀的,但反射光的反射强度与入射光的强度以及入射角度密切相关。垂直地照射到物体表面时比斜照时要亮。
散射光具体计算公式:
其中设光照入射角为α.
散射光照射结果=材质的反射系数×散射光强度×max(cosα,0)
实际开发分两步计算
散射光最终强度=散射光强度×max(cosα,0)
散射光照射结果=材质的反射系数×散射光最终强度
入射角越大,反射强度越弱,当入射角的余弦值为负值时(即入射角大于90度),反射强度为0。由于入射角是光向量与法向量的夹角,cosα= 规格化(光向量)·规格化(法向量)
顶点着色器
#version 300 es
uniform mat4 uMVPMatrix;
uniform mat4 uMMatrix;
uniform vec3 uLightLocation;
in vec3 aPosition;
in vec3 aNormal;
out vec3 vPosition;
out vec4 vDiffuse;
void pointLight (
in vec3 normal,
inout vec4 diffuse,
in vec3 lightLocation,
in vec4 lightDiffuse
){
vec3 normalTarget=aPosition+normal;
vec3 newNormal=(uMMatrix*vec4(normalTarget,1)).xyz-(uMMatrix*vec4(aPosition,1)).xyz;
newNormal=normalize(newNormal);
vec3 vp= normalize(lightLocation-(uMMatrix*vec4(aPosition,1)).xyz);
vp=normalize(vp);
float nDotViewPosition=max(0.0,dot(newNormal,vp));
diffuse=lightDiffuse*nDotViewPosition;
}
void main(){
gl_Position = uMVPMatrix * vec4(aPosition,1);
vec4 diffuseTemp=vec4(0.0,0.0,0.0,0.0);
pointLight(normalize(aNormal), diffuseTemp, uLightLocation, vec4(0.8,0.8,0.8,1.0));
vDiffuse=diffuseTemp;
vPosition = aPosition;
}
片段着色器
#version 300 es
precision mediump float;
in vec3 vPosition;
in vec4 vDiffuse;
out vec4 fragColor;
void main()
{
vec4 finalColor=vec4(物体颜色);
fragColor=finalColor*vDiffuse;
}