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