CSC8502_Advanced_Graphics_For_Games / Shaders / PerPixelFragment.glsl
PerPixelFragment.glsl
Raw
#version 330 core
uniform sampler2D diffuseTex;
uniform vec3 cameraPos;
uniform vec4 lightColour;
uniform vec3 lightPos;
uniform float lightRadius;

in Vertex {
	vec4 colour;
	vec2 texCoord;
	vec3 normal;
	vec3 worldPos;
} IN;

 out vec4 fragColour;
void main ( void ) {
	vec3 incident = normalize ( lightPos - IN.worldPos );
	vec3 viewDir = normalize ( cameraPos - IN.worldPos );
	vec3 halfDir = normalize ( incident + viewDir );

	vec4 diffuse = texture ( diffuseTex , IN.texCoord );
	float lambert = max ( dot ( incident , IN.normal ) , 0.0f );
	float distance = length ( lightPos - IN.worldPos );
	float attenuation = 1.0 - clamp ( distance / lightRadius , 0.0 , 1.0);
	float specFactor = clamp ( dot ( halfDir , IN.normal ) ,0.0 ,1.0);
	specFactor = pow ( specFactor , 60.0 );

	vec3 surface = ( diffuse.rgb * lightColour.rgb);
	fragColour.rgb = surface * lambert * attenuation;
	fragColour.rgb += ( lightColour.rgb * specFactor)* attenuation *0.33;
	fragColour.rgb += surface * 0.1f; // ambient !
	fragColour.a = diffuse.a ;
}