#version 120 attribute vec3 a_position; attribute vec3 a_normal; attribute vec2 a_texcoord; varying vec3 v_position; varying vec3 v_normal; varying vec2 v_texcoord; varying vec3 v_finalColor; uniform mat4 u_modelMatrix; uniform mat4 u_viewMatrix; uniform mat4 u_projectionMatrix; uniform mat4 u_modelViewProjection; uniform vec4 u_sunDirection; uniform vec4 u_sunColor; uniform vec4 u_sunAmbientColor; uniform vec4 u_cameraPos; // #TODO: should use own uniforms #define u_ligthPosition u_sunDirection.xyz #define u_ligthRadius u_sunDirection.w // Calculate blinn-phong per-vertex lighting vec3 CalcPhongLighting( vec3 worldPos, vec3 normal, vec3 lightPos ) { vec3 lightDir = normalize( lightPos - worldPos ); vec3 viewDir = normalize( u_cameraPos.xyz - worldPos ); vec3 halfVec = normalize( lightDir + viewDir ); float diff = max( dot( normal, lightDir ), 0.0 ); float spec = pow( max( dot( normal, halfVec ), 0.0 ), 32.0 ); float lightlength = length( lightPos - worldPos ); float attenuation = max( 0.0, 1.0 - lightlength / u_ligthRadius ); diff = diff * attenuation; spec = spec * attenuation; return u_sunAmbientColor.rgb + (u_sunColor.rgb * diff) + (u_sunColor.rgb * spec); } void main() { v_position = vec3( u_modelMatrix * vec4(a_position, 1.0) ); v_normal = vec3( mat3(u_modelMatrix) * a_normal ); v_texcoord = a_texcoord; v_finalColor = CalcPhongLighting( v_position, v_normal, u_ligthPosition ); gl_Position = u_modelViewProjection * vec4(a_position, 1); }