nuclear@4: uniform sampler2D tex_norm; nuclear@5: uniform vec3 fog_col; nuclear@4: nuclear@3: varying vec3 vpos, vnorm; nuclear@3: varying vec3 ldir, vdir; nuclear@3: nuclear@5: const float fog_dens = 0.075; nuclear@5: nuclear@5: float fog(float dist); nuclear@5: nuclear@3: void main() nuclear@3: { nuclear@4: vec3 tnorm = texture2D(tex_norm, gl_TexCoord[0].st).xyz * 2.0 - 1.0; nuclear@4: vec3 n = normalize(tnorm); nuclear@3: vec3 v = normalize(vdir); nuclear@4: vec3 l = v;//normalize(ldir); nuclear@3: vec3 h = normalize(l + v); nuclear@3: nuclear@4: vec3 diff = vec3(0.8, 0.25, 0.2) * (1.0 - max(dot(l, n), 0.0)); nuclear@4: vec3 spec = 0.5 * vec3(0.9, 0.4, 0.3) * pow(max(dot(h, n), 0.0), 10.0); nuclear@3: nuclear@5: vec3 color = mix(fog_col, diff + spec, fog(vpos.z)); nuclear@5: nuclear@5: gl_FragColor = vec4(color, 1.0); nuclear@3: } nuclear@5: nuclear@5: #define LOG2E 1.442695 nuclear@5: float fog(float dist) nuclear@5: { nuclear@5: return clamp(exp2(-fog_dens * fog_dens * dist * dist * LOG2E), 0.0, 1.0); nuclear@5: }