73 lines
1.5 KiB
Plaintext
73 lines
1.5 KiB
Plaintext
/*
|
|
Bump mapping shader without parallax mapping but with shadows for single directional light source
|
|
*/
|
|
|
|
uniform sampler2D Texture;
|
|
uniform sampler2D NormalMap;
|
|
uniform int NormalMapExists;
|
|
|
|
varying vec2 texCoord;
|
|
varying vec3 camVec;
|
|
varying vec3 lightVec;
|
|
|
|
//For shadows
|
|
uniform sampler2D ShadowMap;
|
|
uniform float ShadowDepth;
|
|
|
|
varying vec4 vPos;
|
|
varying vec4 gPos;
|
|
|
|
float shadowCoef()
|
|
{
|
|
|
|
vec4 shadow_coord = gl_TextureMatrix[2]*vPos;
|
|
|
|
shadow_coord.w = shadow_coord.z;
|
|
|
|
// get the stored depth
|
|
float shadow_d = texture2D(ShadowMap, shadow_coord.xy).x;
|
|
|
|
// get the difference of the stored depth and the distance of this fragment to the light
|
|
float diff = min(shadow_d - shadow_coord.z,0.0);
|
|
|
|
float shadow_coef = clamp( 20*ShadowDepth*diff + 1.0, 0.0, 1.0); //[0..1]
|
|
|
|
return shadow_coef;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
|
|
vec3 norm;
|
|
|
|
vec4 ambient;
|
|
vec4 diffuse;
|
|
vec4 specular;
|
|
|
|
vec3 TexRGB = texture2D(Texture, texCoord.st).rgb;
|
|
|
|
vec3 cVec = normalize(camVec);
|
|
|
|
if (NormalMapExists == 0)
|
|
{
|
|
norm = vec3(0.0,0.0,1.0);
|
|
}
|
|
else
|
|
{
|
|
norm = (texture2D(NormalMap, texCoord.st).rgb - 0.5) * 2.0;
|
|
}
|
|
|
|
float shineFactor = 15.0 * pow(max(dot(cVec, norm),0.0),gl_FrontMaterial.shininess) / (129.0 - gl_FrontMaterial.shininess);
|
|
|
|
float shadow_coef = shadowCoef();
|
|
|
|
ambient = gl_LightSource[0].ambient;
|
|
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse * min( max(dot(lightVec,norm),0.0),shadow_coef);
|
|
specular = gl_LightSource[0].specular * min(shineFactor,shadow_coef);
|
|
|
|
|
|
gl_FragColor = vec4(TexRGB,1.0)*max(ambient,diffuse)+specular;
|
|
|
|
|
|
}
|