Some of the values in the specular calculations are tweaked to get the best results.
Code: Select all
// tank_fragment.glsl
//Used to light all models
#version 130
uniform sampler2D colorMap;
uniform sampler2D normalMap;
uniform sampler2D gmmMap;
uniform sampler2D aoMap;
uniform sampler2D detailMap;
uniform sampler2D camoMap;
uniform int is_GAmap;
uniform int alphaTest;
uniform vec2 detailTiling;
uniform vec4 tile_vec4;
uniform float detailPower;
uniform int use_camo; // if camo is active
uniform int exclude_camo; // if this item has camo
uniform vec4 c0;
uniform vec4 c1;
uniform vec4 c2;
uniform vec4 c3;
uniform vec4 armorcolor;
uniform vec4 camo_tiliing;
in vec2 TC1;
in vec3 vVertex;
//in vec3 lightDirection;
in mat3 TBN;
in vec3 t;
in vec3 b;
in vec3 n;
out vec4 color_out;
//
void main(void) {
//==================================
vec2 ctc = TC1 * camo_tiliing.xy; // from scripts/vehicle/nation/customiztion.xml file
ctc.xy *= tile_vec4.xy;
ctc.xy += camo_tiliing.zw; // from scripts/vehicle/nation/tank.xml file
ctc.xy += tile_vec4.zw;
//ctc.y*= -1.0;
vec4 camoTexture = texture2D(camoMap, ctc.st );
vec4 cc = vec4(0.0);
//==================================
vec3 lightDirection;
vec3 detailBump;
vec3 bump;
float alpha;
vec4 sum = vec4(0.0);
float a;
vec3 bumpMap;
vec3 detBump;
float spec_l = 1.0;
float spec_power = 30.0;
vec2 GMM;
//==================================
// get data
vec4 AO = texture2D(aoMap, TC1.st);
vec4 detail = texture2D(detailMap, TC1.st * detailTiling);
vec3 dr = vec3(detail.r) ;
vec3 db = vec3(detail.b) ;
vec4 base = texture2D(colorMap, TC1.st);
vec4 color = base;
a = base.a;
if (is_GAmap == int(1))
{
detBump.xy = (2.0 * texture2D(detailMap, TC1.st* detailTiling).gb - 1.0);
detBump.z = sqrt(1.0 - dot(detBump.xy, detBump.xy));
detBump = normalize(detBump);
//detBump.y *= - 1.0;
bumpMap.xy = (2.0 * texture2D(normalMap, TC1.st).ag - 1.0);
bumpMap.z = sqrt(1.0 - dot(bumpMap.xy, bumpMap.xy));
bumpMap = normalize(bumpMap);
bumpMap.y *= - 1.0;
a = texture2D(normalMap, TC1.st).r;
// red color variance ; alpha = specular
GMM = texture2D(gmmMap, TC1.st).rg;
spec_l = GMM.g;
color += (color * GMM.r)*0.5;
color *= 0.6;
if (AO.g > 0.0)
{
if (use_camo > 0 && exclude_camo == 0)
{
// This is based on RexTimmy's orginal work. Thanks!
cc = armorcolor ;
cc = mix(cc, c0 , camoTexture.r * c0.a );
cc = mix(cc, c1 , camoTexture.g * c1.a );
cc = mix(cc, c2 , camoTexture.b * c2.a );
cc = mix(cc, c3 , camoTexture.a * c3.a );
color = mix(color, cc, AO.a * AO.g)*.75;
base.rgb = color.rgb;
}
color.rgb = mix(color.rgb,color.rgb*detail.rgb*AO.r,detail.a*.13)*.6;
base.rgb = color.rgb;
} else {
color.rgb *= GMM.r * 4.0;
base.rgb = color.rgb;
}// end AO.g
} else {
color.rgb *= 2.0;
bumpMap = (2.0 * texture2D(normalMap, TC1.st).rgb) - 1.0;
bumpMap = normalize(bumpMap);
spec_l = 0.2;
} //end is_GAmap
if (alphaTest == int(1)) { if (a < 0.5) {discard;} }
vec3 PN = normalize(TBN * bumpMap); // Get the perturbed normal
vec3 PN_D = normalize(TBN * detBump); // Get the perturbed normal
if (is_GAmap == int(0)) PN_D = vec3(0.0);
vec4 Ispec1 = vec4(0.0);
vec4 Ispec2 = vec4(0.0);
vec4 Ispec3 = vec4(0.0);
vec4 IspecSum = vec4(0.0);
vec4 Iamb = color*0.5; //calculate Ambient Term:
vec4 Idiff2 = vec4(0.0);
vec4 Idiff1 = vec4(0.0);
for (int i = 0 ; i < 3 ; i++)
{
// GMM.g is metel spec level
// GMM.r is surface roughness
vec3 L = normalize(gl_LightSource[i].position.xyz - vVertex);
vec3 E = normalize(-vVertex); // we are in Eye Coordinates, so EyePos is (0,0,0)
vec3 R = normalize(reflect(-L,PN));
vec3 R_D = normalize(reflect(-L,PN_D));
if (is_GAmap != 1) GMM.xy = vec2(0.3,0.3);
//calculate Diffuse Term:
Idiff1 = color * max(dot(PN,L*sin(GMM.g)), 0.0)* 5.0 * AO.g;//color light level
Idiff2 = color * max(dot(PN_D,L), 0.0)* 0.5 * AO.g * detail.a; // detail color loght level
Idiff1 = clamp(Idiff1, 0.0, 1.0);
Idiff2 = clamp(Idiff2, 0.0, 1.0);
// calculate Specular Term:
Ispec1 = vec4(0.3) * pow(max(dot(R,E*(sin(GMM.g)*1.75)),0.0),60.0 * (0.9-GMM.g) ) * GMM.r * AO.r * 3.0; //metel spec
Ispec2 = vec4(0.3) * pow(max(dot(R,E),0.0),60.0 * GMM.r ) * GMM.r * AO.r * 3.0; // bump map spec
Ispec3 = vec4(0.5) * pow(max(dot(R_D,E),0.0), detailPower) * GMM.g * 3.0; //detail spec
Ispec1 = clamp(Ispec1, 0.0, 1.0);
Ispec2 = clamp(Ispec2, 0.0, 1.0);
Ispec3 = clamp(Ispec3, 0.0, 1.0);
vec4 Ispec1 = mix(Ispec1 + Ispec2, Ispec3,0.33);
sum += Idiff1 + Idiff2 + Ispec1;
IspecSum += Ispec1;
} //next light
gl_FragColor = Iamb + sum; // write mixed Color:
}