Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
86 lines (65 sloc) 1.84 KB

Lighting

thanks to everyone who created the Shader School =)

Basic vertex for Lambert and Phong

precision mediump float;

attribute vec3 position, normal;

uniform mat4 model, view, projection;
uniform mat4 inverseModel, inverseView, inverseProjection;
varying vec3 vNormal, vPosition;

void main() {
  vec4 viewPosition = view * model * vec4(position, 1.0);
  
  // important : normal with inverse transforms
  vec4 viewNormal = vec4(normal, 0.) * inverseModel * inverseView;
  
  gl_Position = projection * viewPosition;
  vNormal = viewNormal.xyz;
  vPosition = viewPosition.xyz;
}

Lambert

float lambert(vec3 n, vec3 d)
{
	// n : surface view normalized
	// d : direction of the light normalized
	return dot(n, d);
}

Phong

float phong(vec3 light, vec3 normal, vec3 eyeDirection, float shininess)
{
	// light        : normalized light direction
	// normal       : surface view normal
	// eyeDirection : normalized vPosition
	// shininess    : self explanatory =) 

    return pow(max(dot(reflect(light, normal), eyeDirection), 0.0), shininess);
}

Creating color

vec3 eyeDirection = normalize(vPosition);
vec3 light = ambient + 
        diffuse * lambert(vNormal, lightDirection) + 
        specular * phong( 
        	normalize(lightDirection), 
        	vNormal, 
        	eyeDirection, 
        	shininess 
        );

Gooch shading

float goochWeight(vec3 normal, vec3 lightDirection) {
  return 0.5 * (1.0 + dot(normal, lightDirection));
}

vec3 goochColor(vec3 cool, vec3 warm, float weight) {
  return mix(cool, warm, weight);
}

float weight = goochWeight(normal, light);
vec3 normal = normalize(vNormal);
vec3 light = normalize(lightDirection);
vec3 lightColor = goochColor(cool, warm, wight);
gl_FragColor = vec4(lightColor,1);