#version 330
uniform sampler2D un_normalMap;
uniform sampler2D un_colorMap;
smooth in vec2 var_vTexCoord;
smooth in vec3 var_vNormalT;
smooth in vec3 var_vToEye;
smooth in vec3 var_vToLight;
out vec4 out_fragColor;
const vec3 cst_lightAmbient = vec3(0.2, 0.2, 0.2);
const vec3 cst_lightDiffuse = vec3(0.6, 0.6, 0.6);
const vec3 cst_lightSpecular = vec3(1.0, 1.0, 1.0);
const float cst_matAmbientFactor = 1.0;
const float cst_matDiffuseFactor = 1.0;
const float cst_matSpecularFactor = 1.0;
const float cst_matShininess = 20.0;
vec3 GetDiffuseColor()
{
return texture2D(un_colorMap, var_vTexCoord).rgb;
}
vec3 GetNormal()
{
return texture2D(un_normalMap, var_vTexCoord).rgb;
}
vec4 CalculateLightingFactor()
{
vec3 vToEyeN = normalize(var_vToEye);
vec3 vToLightN = normalize(var_vToLight);
vec3 normal = normalize(GetNormal() * 2.0 - vec3(1.0));
vec3 ambientFactor = cst_matAmbientFactor * cst_lightAmbient;
vec3 diffuseFactor = cst_matDiffuseFactor * cst_lightDiffuse * max(dot(vToLightN, normal), 0.0);
vec3 specularFactor = cst_matSpecularFactor * cst_lightSpecular * pow(max(dot(reflect(- vToLightN, normal), vToEyeN), 0.0), cst_matShininess);
return vec4(ambientFactor + diffuseFactor + specularFactor, 1.0);
}
void main()
{
vec4 color = vec4(GetDiffuseColor(), 1.0);
vec4 littenColor = CalculateLightingFactor() * color;
out_fragColor = littenColor;
}