www.pudn.com > AndreasHalm-src.zip > cube_sides_default.fragmentshader
// specular+cubemap modified by texture shader
// uses the varyings below to calculate specular reflection
// the cube map is multiplied into the diffuse channel
// where texture 0 is not transparent:
// - a different specular lighting is applied, so that the
// texture is always readable. the lighting has a smaller
// "specular cone" and is less bright (0.5)
// - the cubemap affects the diffuse lighting to a smaller
// degree (0.3)
const vec4 AMBIENT = vec4( 0.1, 0.1, 0.1, 1.0 );
const vec4 SPECULAR = vec4( 1.0, 1.0, 1.0, 1.0 );
varying vec4 Cd;
varying vec4 V_eye;
varying vec4 L_eye;
varying vec4 N_eye;
varying vec3 eyespace_position;
uniform sampler2D tex0;
uniform samplerCube texCube;
void main(void)
{
// the texture at this pixel
vec4 texture = texture2D(tex0,gl_TexCoord[0].st);
// lighting
vec3 V = normalize(vec3(V_eye));
vec3 L = normalize(vec3(L_eye));
vec3 N = normalize(vec3(N_eye));
float diffuse = clamp(dot(L, N), 0.0, 1.0);
vec3 H = normalize(L + V);
float specular = clamp(pow(dot(N, H), 20.0), 0.0, 1.0);
float sharp_specular = smoothstep(0.9, 0.999, specular);
// cubemap stuff
vec3 u = normalize(eyespace_position);
vec3 texcube_coord = reflect(u,vec3(N_eye));
vec4 texture_cubemap = textureCube(texCube,texcube_coord);
// the cubemap affects the diffuse color and, to a certain degree (0.3) the diffuse texture
vec4 color = AMBIENT + (Cd*diffuse*texture_cubemap) + (SPECULAR*specular);
vec4 tex0_cubemap_modifier = vec4(0.7,0.7,0.7,1.0) + texture_cubemap*0.3;
vec4 texture_lit = AMBIENT + (texture*diffuse*tex0_cubemap_modifier) + (SPECULAR*0.5*sharp_specular);
// normal lighting and the lighting where the texture is is mixed using the texture alpha value
vec3 col = mix(color.rgb,texture_lit.rgb,texture.a);
gl_FragColor = vec4(col,color.a);
}