nuclear@29: #ifdef GL_ES nuclear@30: precision mediump float; nuclear@29: #endif nuclear@29: nuclear@29: uniform sampler2D tex, tex_norm; nuclear@29: nuclear@29: varying vec3 vpos, normal, tangent; nuclear@29: varying vec4 color, tc; nuclear@29: varying vec3 lpos; nuclear@29: nuclear@29: void main() nuclear@29: { nuclear@29: vec4 fog_color = vec4(0.0, 0.0, 0.0, 1.0); nuclear@29: vec3 tcol = texture2D(tex, tc.xy * vec2(1.0, -1.0)).xyz; nuclear@29: vec3 tnorm = texture2D(tex_norm, tc.xy * vec2(1.0, -1.0)).xyz; nuclear@29: nuclear@29: float fog = exp(-(0.2 * -vpos.z)); nuclear@29: nuclear@29: vec3 ldir = lpos - vpos; nuclear@29: float ldist = length(ldir); nuclear@29: nuclear@29: /* bring the light direction to tangent space */ nuclear@29: vec3 norm = normalize(normal); nuclear@29: vec3 tang = normalize(tangent); nuclear@29: vec3 bitan = cross(norm, tang); nuclear@29: nuclear@29: mat3 tbn_xform = mat3(tang.x, bitan.x, norm.x, nuclear@29: tang.y, bitan.y, norm.y, nuclear@29: tang.z, bitan.z, norm.z); nuclear@29: nuclear@29: vec3 l = normalize(tbn_xform * ldir); nuclear@29: nuclear@29: /* grab normal from the normalmap */ nuclear@29: vec3 n = normalize(tnorm * 2.0 - 1.0); nuclear@29: nuclear@29: float diffuse = max(dot(n, l), 0.0); nuclear@29: nuclear@29: /* blinn-phong specular */ nuclear@29: vec3 v = normalize(-vpos); nuclear@29: vec3 h = normalize(v + l); nuclear@29: float specular = pow(max(dot(n, h), 0.0), 60.0); nuclear@29: nuclear@30: const vec3 amb = vec3(0.02, 0.02, 0.02); nuclear@29: nuclear@29: float att = clamp(1.0 / (0.5 * (ldist * ldist)), 0.0, 1.0); nuclear@29: nuclear@29: vec3 dif = tcol * diffuse * att; nuclear@29: vec3 spec = vec3(0.6, 0.6, 0.6) * specular * att; nuclear@29: nuclear@29: gl_FragColor = vec4(fog * (amb + dif + spec), 1.0); nuclear@29: }