rendering-basic-light.frag 1.05 KB
varying mediump vec3 vNormal;
varying mediump vec3 vFragPos;
uniform mediump vec3 viewPos; // custom uniform

struct Material
{
  mediump vec3 ambient;
  mediump vec3 diffuse;
  mediump vec3 specular;
  mediump float shininess;
};

struct Light
{
  mediump vec3 position;
  mediump vec3 color;
};

uniform Material material; // custom uniform
uniform Light light;       // custom uniform

void main()
{
  // Ambient
  mediump vec3 ambient = material.ambient * light.color;
  // Diffuse
  mediump vec3 norm = normalize(vNormal);
  mediump vec3 lightDir = normalize(light.position - vFragPos);
  mediump float diff = max(dot(norm, lightDir), 0.0);
  mediump vec3 diffuse = material.diffuse * diff * light.color;

  // Specular
  mediump vec3 viewDir = normalize(viewPos - vFragPos);
  mediump vec3 reflectDir = reflect(-lightDir, norm);
  mediump float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
  mediump vec3 specular = material.specular * spec * light.color;
  mediump vec3 result = (ambient + diffuse + specular);
  gl_FragColor = vec4(result, 1.0);
}