Source

gltut / Tut 14 Textures Are Not Pictures / data / TextureShininess.frag

Jason McKesson 05113d8 



Jason McKesson 6fe4304 
Jason McKesson 05113d8 



























Jason McKesson 6fe4304 
Jason McKesson 05113d8 












Jason McKesson 6fe4304 
Jason McKesson 05113d8 























Jason McKesson 6fe4304 
Jason McKesson 05113d8 











Jason McKesson 6fe4304 

Jason McKesson 05113d8 



Jason McKesson 6fe4304 
Jason McKesson 05113d8 


#version 330

in vec3 vertexNormal;
in vec3 cameraSpacePosition;
in vec2 shinTexCoord;

out vec4 outputColor;

layout(std140) uniform;

uniform Material
{
	vec4 diffuseColor;
	vec4 specularColor;
	float specularShininess;
} Mtl;

struct PerLight
{
	vec4 cameraSpaceLightPos;
	vec4 lightIntensity;
};

const int numberOfLights = 2;

uniform Light
{
	vec4 ambientIntensity;
	float lightAttenuation;
	PerLight lights[numberOfLights];
} Lgt;

uniform sampler2D gaussianTexture;
uniform sampler2D shininessTexture;

float CalcAttenuation(in vec3 cameraSpacePosition,
	in vec3 cameraSpaceLightPos,
	out vec3 lightDirection)
{
	vec3 lightDifference =  cameraSpaceLightPos - cameraSpacePosition;
	float lightDistanceSqr = dot(lightDifference, lightDifference);
	lightDirection = lightDifference * inversesqrt(lightDistanceSqr);
	
	return (1 / ( 1.0 + Lgt.lightAttenuation * lightDistanceSqr));
}

vec4 ComputeLighting(in PerLight lightData, in vec3 cameraSpacePosition,
	in vec3 cameraSpaceNormal, in float specularShininess)
{
	vec3 lightDir;
	vec4 lightIntensity;
	if(lightData.cameraSpaceLightPos.w == 0.0)
	{
		lightDir = vec3(lightData.cameraSpaceLightPos);
		lightIntensity = lightData.lightIntensity;
	}
	else
	{
		float atten = CalcAttenuation(cameraSpacePosition,
			lightData.cameraSpaceLightPos.xyz, lightDir);
		lightIntensity = atten * lightData.lightIntensity;
	}
	
	vec3 surfaceNormal = normalize(cameraSpaceNormal);
	float cosAngIncidence = dot(surfaceNormal, lightDir);
	cosAngIncidence = cosAngIncidence < 0.0001 ? 0.0 : cosAngIncidence;
	
	vec3 viewDirection = normalize(-cameraSpacePosition);
	
	vec3 halfAngle = normalize(lightDir + viewDirection);
	vec2 texCoord;
	texCoord.s = dot(halfAngle, surfaceNormal);
	texCoord.t = specularShininess;
	float gaussianTerm = texture(gaussianTexture, texCoord).r;

	gaussianTerm = cosAngIncidence != 0.0 ? gaussianTerm : 0.0;
	
	vec4 lighting = Mtl.diffuseColor * lightIntensity * cosAngIncidence;
	lighting += Mtl.specularColor * lightIntensity * gaussianTerm;
	
	return lighting;
}

void main()
{
	float specularShininess = texture(shininessTexture, shinTexCoord).r;

	vec4 accumLighting = Mtl.diffuseColor * Lgt.ambientIntensity;
	for(int light = 0; light < numberOfLights; light++)
	{
		accumLighting += ComputeLighting(Lgt.lights[light],
			cameraSpacePosition, vertexNormal, specularShininess);
	}
	
	outputColor = sqrt(accumLighting); //2.0 gamma correction
}