1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#version 330
precision highp float;
uniform sampler2D em_DiffuseTexture;
smooth in vec2 em_FragTexCoord0;
smooth in vec4 em_FrontColor;
smooth in vec3 normal;
smooth in vec3 lightDir[3];
smooth in vec3 eyeVec; // La petite subtilité (3)
float computeFog (float density)
{
const float LOG2 = 1.442695;
float z = gl_FragCoord.z / gl_FragCoord.w;
float fogFactor = exp2(-density * density * z * z * LOG2);
return clamp(fogFactor, 0.0, 1.0);
}
void main (void)
{
vec4 fogColor = vec4(0.1, 0.0, 0.0, 1.0);
float fogFactor = computeFog(0.0001);
vec4 baseColor = mix(texture2D(em_DiffuseTexture, em_FragTexCoord0), em_FrontColor, 0.5);
// Ambient
vec4 finalColor = vec4(0.01, 0.0, 0.0, 1.0);
int i;
for ( i = 0; i < 3; i++ )
{
// Diffuse
float diffuseFactor = max(0.0, dot(normalize(normal), normalize(lightDir[i])));
if ( diffuseFactor > 0.0 )
{
finalColor += diffuseFactor * baseColor;
// Specular
vec3 E = normalize(eyeVec); // La petite subtilité (4)
vec3 R = normalize(reflect(-normalize(lightDir[i]), normalize(normal)));
float spec = max(0.0, dot(R, E)); // // La petite subtilité (5), avant j'utilisais le vecteur normal.
float fSpec = pow(spec, 128.0);
finalColor.rgb += vec3(fSpec, fSpec, fSpec);
}
}
gl_FragColor = mix(fogColor, vec4(finalColor.rgb, 1.0), fogFactor);
} |
Partager