第 6 课:Shininess
实现
uniform float iTime;
varying vec3 vPos;
varying vec3 vNormal;
varying vec2 vUv;
float getProgress() {
float m = mod(iTime * 0.5, 2.0);
float t = fract(m);
if (m > 1.0) {
t = 1.0 - t;
}
return pow(2.0, 10.0 * t - 10.0);
}
void main() {
vec3 viewPos = vec3(0.0, 0.0, 2.5);
vec3 objectColor = vec3(0.75, 0.45, 0.45);
vec3 fragNormal = normalize(vNormal);
vec3 fragPos = vPos;
vec3 lightColor = vec3(1.0, 1.0, 0.75);
vec3 lightPos = vec3(-2.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 Shininess = mix(1.0, 256.0, getProgress());
float specular = pow(max(dot(viewDir, reflectDir), 0.0), Shininess);
vec3 result = lightColor * (ambient + diffuse + specular) * objectColor;
gl_FragColor = vec4(result, 1.0);
}