第 5 课:Light Attenuation
实现
uniform sampler2D iChannel0;
varying vec3 vPos;
varying vec3 vNormal;
varying vec2 vUv;
void main() {
vec3 viewPos = vec3(0.0, 0.0, 2.5);
float Kc = 1.0;
float Kl = 0.0;
float Kq = 0.1;
vec3 objectColor = texture2D(iChannel0, vUv).rgb;
vec3 fragNormal = normalize(vNormal);
vec3 fragPos = vPos;
vec3 lightColor = vec3(1.0, 1.0, 0.75) * 3.0;
vec3 lightPos = vec3(-1.0, 2.0, 2.0);
vec3 lightDir = normalize(lightPos - fragPos);
float ambient = 0.2;
float diffuse = max(dot(fragNormal, lightDir), 0.0);
vec3 viewDir = normalize(viewPos - fragPos);
vec3 reflectDir = reflect(-lightDir, fragNormal);
float specular = max(dot(viewDir, reflectDir), 0.0);
specular = pow(specular, 32.0);
float Distance = distance(vPos, lightPos);
float Attenuation = 1.0 / (Kc + Kl * Distance + Kq * Distance * Distance);
vec3 result = lightColor * (ambient + diffuse + specular) * Attenuation * objectColor;
gl_FragColor = vec4(result, 1.0);
}