| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -4,73 +4,79 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			in vec2 fragTexCoord; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			in vec3 fragNormal; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Diffuse data | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Input uniform values | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform sampler2D texture0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec4 fragTintColor; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Light attributes | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 light_diffuseColor = vec3(1.0, 0.5, 0.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 light_specularColor = vec3(0.0, 1.0, 0.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float light_intensity = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float light_specIntensity = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Output fragment color | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			out vec4 finalColor; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Material attributes | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 mat_ambientColor = vec3(1.0, 1.0, 1.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 mat_specularColor = vec3(1.0, 1.0, 1.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float mat_glossiness = 50.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: Add here your custom variables | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// World attributes | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 lightPos; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 cameraPos; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Light uniform values | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 lightAmbientColor = vec3(0.6, 0.3, 0.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 lightDiffuseColor = vec3(1.0, 0.5, 0.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 lightSpecularColor = vec3(0.0, 1.0, 0.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float lightIntensity = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float lightSpecIntensity = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Fragment shader output data | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			out vec4 fragColor; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Material uniform values | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 matAmbientColor = vec3(1.0, 1.0, 1.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 matSpecularColor = vec3(1.0, 1.0, 1.0); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float matGlossiness = 50.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// World uniform values | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 lightPosition; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform vec3 cameraPosition; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Calculate ambient lighting component | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			vec3 AmbientLighting() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   return (mat_ambientColor*light_ambientColor); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return (matAmbientColor*lightAmbientColor); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Calculate diffuse lighting component | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			vec3 DiffuseLighting(in vec3 N, in vec3 L) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   // Lambertian reflection calculation | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   float diffuse = clamp(dot(N, L), 0, 1); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   return (fragTintColor.xyz*light_diffuseColor*light_intensity*diffuse); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Lambertian reflection calculation | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float diffuse = clamp(dot(N, L), 0, 1); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return (fragTintColor.xyz*lightDiffuseColor*lightIntensity*diffuse); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Calculate specular lighting component | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   float specular = 0.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float specular = 0.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   // Calculate specular reflection only if the surface is oriented to the light source | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   if (dot(N, L) > 0) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // Calculate half vector | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      vec3 H = normalize(L + V); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			       | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // Calculate specular intensity | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      specular = pow(dot(N, H), 3 + mat_glossiness); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Calculate specular reflection only if the surface is oriented to the light source | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (dot(N, L) > 0) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Calculate half vector | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        vec3 H = normalize(L + V); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Calculate specular intensity | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        specular = pow(dot(N, H), 3 + matGlossiness); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   return (mat_specularColor*light_specularColor*light_specIntensity*specular); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return (matSpecularColor*lightSpecularColor*lightSpecIntensity*specular); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void main() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Normalize input vectors | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 L = normalize(lightPos); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 V = normalize(cameraPos); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 L = normalize(lightPosition); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 V = normalize(cameraPosition); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 N = normalize(fragNormal); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Calculate lighting components  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 ambient = AmbientLighting(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 diffuse = DiffuseLighting(N, L); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 specular = SpecularLighting(N, L, V); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Get base color from texture | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec4 textureColor = texture(texture0, fragTexCoord); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec3 finalColor = textureColor.rgb; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    fragColor = vec4(finalColor * (ambient + diffuse + specular), textrr">urlass="err">eColor.a); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Texel color fetching from texture sampler | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec4 texelColor = texture(texture0, fragTexCoord); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Calculate final fragment color | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    finalColor = vec4(texelColor.rgb*(ambient + diffuse + specular), texelColor.a); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} |