47 lines
1.2 KiB
C
47 lines
1.2 KiB
C
// -*- mode: C; -*-
|
|
// Licence: GPL v2
|
|
// Author: Frederic Bouvier
|
|
|
|
varying vec4 ecPosition;
|
|
varying vec3 VNormal;
|
|
varying vec3 VTangent;
|
|
varying vec3 VBinormal;
|
|
varying vec4 constantColor;
|
|
|
|
uniform sampler2D tex_color;
|
|
uniform sampler2D tex_normal;
|
|
|
|
void main (void)
|
|
{
|
|
vec4 ns = texture2D(tex_normal, gl_TexCoord[0].st);
|
|
vec3 N = ns.rgb * 2.0 - 1.0;
|
|
N = normalize(N.x * VTangent + N.y * VBinormal + N.z * VNormal);
|
|
|
|
float nDotVP = max(0.0, dot(N, normalize(gl_LightSource[0].position.xyz)));
|
|
float nDotHV = max(0.0, dot(N, gl_LightSource[0].halfVector.xyz));
|
|
|
|
float pf;
|
|
if (nDotVP == 0.0)
|
|
pf = 0.0;
|
|
else
|
|
pf = pow(nDotHV, gl_FrontMaterial.shininess);
|
|
|
|
vec4 Diffuse = gl_LightSource[0].diffuse * nDotVP;
|
|
vec4 Specular = gl_LightSource[0].specular * pf;
|
|
|
|
vec4 color = constantColor + Diffuse * gl_FrontMaterial.diffuse;
|
|
color *= texture2D(tex_color, gl_TexCoord[0].xy);
|
|
|
|
color += Specular * gl_FrontMaterial.specular * ns.a;
|
|
color = clamp( color, 0.0, 1.0 );
|
|
|
|
|
|
float fogFactor;
|
|
float fogCoord = ecPosition.z;
|
|
const float LOG2 = 1.442695;
|
|
fogFactor = exp2(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord * LOG2);
|
|
fogFactor = clamp(fogFactor, 0.0, 1.0);
|
|
|
|
|
|
gl_FragColor = mix(gl_Fog.color, color, fogFactor);
|
|
}
|