Double. Sue me.
So, while the issue is the normal maps having excessive range, it should be handled better than to induce transparent clipping.
#ifdef FLAG_LIGHT
uniform int n_lights;
#endif
#ifdef FLAG_DIFFUSE_MAP
uniform sampler2D sBasemap;
#endif
#ifdef FLAG_GLOW_MAP
uniform sampler2D sGlowmap;
#endif
#ifdef FLAG_SPEC_MAP
uniform sampler2D sSpecmap;
#endif
#ifdef FLAG_ENV_MAP
uniform samplerCube sEnvmap;
uniform bool alpha_spec;
varying vec3 envReflect;
#endif
#ifdef FLAG_NORMAL_MAP
uniform sampler2D sNormalmap;
varying mat3 tbnMatrix;
#endif
#ifdef FLAG_FOG
varying float fogDist;
#endif
varying vec4 position;
varying vec3 lNormal;
#if SHADER_MODEL == 2
#define MAX_LIGHTS 2
#else
#define MAX_LIGHTS 8
#endif
void main()
{
float attenuation;
float NdotL;
float NdotHV;
vec3 lightDir;
vec3 eyeDir = vec3(normalize(-position).xyz); // Camera is at (0,0,0) in ModelView space
vec4 lightAmbientDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
vec4 lightDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
vec4 lightAmbient = gl_FrontMaterial.emission + (gl_LightModel.ambient * gl_FrontMaterial.ambient);
vec4 lightSpecular = vec4(0.0, 0.0, 0.0, 1.0);
vec2 texCoord = gl_TexCoord[0].xy;
#ifdef FLAG_LIGHT
#ifdef FLAG_NORMAL_MAP
// Normal map - convert from DXT5nm
vec3 normal;
normal.rg = (texture2D(sNormalmap, texCoord).ag * 2.0) - 1.0;
normal.b = sqrt(1.0 - dot(normal.rg, normal.rg));
normal = normalize(tbnMatrix * normal);
#else
vec3 normal = lNormal;
#endif
#pragma optionNV unroll all
for (int i = 0; i < MAX_LIGHTS; ++i) {
#if SHADER_MODEL > 2
if (i > n_lights)
break;
#endif
float specularIntensity = 1.0;
// Attenuation and light direction
#if SHADER_MODEL > 2
if (gl_LightSource[i].position.w == 1.0) {
#else
if (gl_LightSource[i].position.w == 1.0 && i != 0) {
#endif
// Positional light source
float dist = distance(gl_LightSource[i].position.xyz, position.xyz);
float spotEffect = 1.0;
if (gl_LightSource[i].spotCutoff < 91.0) {
spotEffect = dot(normalize(gl_LightSource[i].spotDirection), normalize(-position.xyz));
if (spotEffect < gl_LightSource[i].spotCosCutoff) {
spotEffect = 0.0;
}
}
attenuation = spotEffect / (gl_LightSource[i].constantAttenuation + (gl_LightSource[i].linearAttenuation * dist) + (gl_LightSource[i].quadraticAttenuation * dist * dist));
lightDir = normalize(gl_LightSource[i].position.xyz - position.xyz);
specularIntensity = 4.3; // Point light
} else {
// Directional light source
attenuation = 1.0;
lightDir = normalize(gl_LightSource[i].position.xyz);
specularIntensity = 1.5; // Directional light
}
// Ambient and Diffuse
NdotL = max(dot(normal, lightDir), 0.0);
lightAmbient += (gl_FrontLightProduct[i].ambient * attenuation);
lightDiffuse += ((gl_FrontLightProduct[i].diffuse * NdotL) * attenuation);
// Specular
NdotHV = clamp(dot(normal, normalize(eyeDir + lightDir)), 0.0, 1.0);
lightSpecular += ((gl_FrontLightProduct[i].specular * pow(max(0.0, NdotHV), gl_FrontMaterial.shininess)) * attenuation) * specularIntensity;
}
lightAmbientDiffuse = lightAmbient + lightDiffuse;
#else
lightAmbientDiffuse = gl_Color;
lightSpecular = gl_SecondaryColor;
#endif
#ifdef FLAG_DIFFUSE_MAP
// Base color
vec4 baseColor = gl_Color * texture2D(sBasemap, texCoord);
#else
vec4 baseColor = gl_Color;
#endif
vec4 fragmentColor = baseColor * max(lightAmbientDiffuse, gl_LightModel.ambient - 0.425);
fragmentColor.a = baseColor.a + (dot(lightSpecular, lightSpecular) * 0.1);
#ifdef FLAG_SPEC_MAP
// Spec color
float specularFactor = 1.75;
fragmentColor.rgb += lightSpecular.rgb * (texture2D(sSpecmap, texCoord).rgb * specularFactor);
#else
fragmentColor.rgb += lightSpecular.rgb * (baseColor.rgb * 0.6);
#endif
#ifdef FLAG_ENV_MAP
// Env color
vec3 envIntensity = (alpha_spec) ? vec3(texture2D(sSpecmap, texCoord).a) : texture2D(sSpecmap, texCoord).rgb;
fragmentColor.a += (dot(textureCube(sEnvmap, envReflect).rgb, textureCube(sEnvmap, envReflect).rgb) * 0.3);
fragmentColor.rgb += textureCube(sEnvmap, envReflect).rgb * envIntensity;
#endif
#ifdef FLAG_GLOW_MAP
// Glow color
fragmentColor.rgb += texture2D(sGlowmap, texCoord).rgb * 1.5;
#endif
#ifdef FLAG_FOG
fragmentColor.rgb = mix(fragmentColor.rgb, gl_Fog.color.rgb, fogDist);
#endif
gl_FragColor = fragmentColor;
}