Index: ps/trunk/binaries/data/mods/mod/shaders/glsl/common/shading.h =================================================================== --- ps/trunk/binaries/data/mods/mod/shaders/glsl/common/shading.h +++ ps/trunk/binaries/data/mods/mod/shaders/glsl/common/shading.h @@ -15,6 +15,11 @@ return normal; } +vec3 calculateSpecular(vec3 normal, vec3 vhalf, vec3 sunColor, vec3 color, float power) +{ + return sunColor * color * pow(max(0.001, dot(normal, vhalf)), power); +} + vec3 calculateShading(vec3 albedo, vec3 sunDiffuse, vec3 specular, vec3 ambient, float shadow, float ao) { return (albedo * sunDiffuse + specular.rgb) * shadow + albedo * ambient * ao; Index: ps/trunk/binaries/data/mods/mod/shaders/glsl/terrain_common.fs =================================================================== --- ps/trunk/binaries/data/mods/mod/shaders/glsl/terrain_common.fs +++ ps/trunk/binaries/data/mods/mod/shaders/glsl/terrain_common.fs @@ -102,25 +102,24 @@ vec3 sundiffuse = v_lighting; #endif - vec4 specular = vec4(0.0); + vec3 specular = vec3(0.0); + float emissionWeight = 0.0; #if USE_SPECULAR_MAP - vec3 specCol; - float specPow; #if USE_TRIPLANAR vec4 s = triplanar(GET_DRAW_TEXTURE_2D(specTex), v_tex); #else vec4 s = SAMPLE_2D(GET_DRAW_TEXTURE_2D(specTex), v_tex); #endif - specCol = s.rgb; - specular.a = s.a; - specPow = effectSettings.y; - specular.rgb = sunColor * specCol * pow(max(0.001, dot(normalize(normal), v_half)), specPow); + vec3 specCol = s.rgb; + float specPow = effectSettings.y; + specular = calculateSpecular(normal, normalize(v_half), sunColor, specCol, specPow); + emissionWeight = s.a; #endif - vec3 color = calculateShading(texdiffuse, sundiffuse, specular.rgb, ambient, getShadowOnLandscape(), 1.0); + vec3 color = calculateShading(texdiffuse, sundiffuse, specular, ambient, getShadowOnLandscape(), 1.0); #if USE_SPECULAR_MAP && USE_SELF_LIGHT - color = mix(texdiffuse, color, specular.a); + color = mix(texdiffuse, color, emissionWeight); #endif color = applyFog(color, fogColor, fogParams); Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.fs @@ -89,13 +89,14 @@ vec3 sundiffuse = v_lighting.rgb; #endif - vec4 specular = vec4(0.0); + vec3 specular = vec3(0.0); + float emissionWeight = 0.0; #if USE_SPECULAR_MAP vec4 s = SAMPLE_2D(GET_DRAW_TEXTURE_2D(specTex), coord); vec3 specCol = s.rgb; - specular.a = s.a; float specPow = effectSettings.y; - specular.rgb = sunColor * specCol * pow(max(0.001, dot(normalize(normal), v_half)), specPow); + specular = calculateSpecular(normal, normalize(v_half), sunColor, specCol, specPow); + emissionWeight = s.a; #endif #if (USE_INSTANCING || USE_GPU_SKINNING) && USE_AO @@ -104,10 +105,10 @@ float ao = 1.0; #endif - vec3 color = calculateShading(texdiffuse, sundiffuse, specular.rgb, ambient, getShadow(), ao); + vec3 color = calculateShading(texdiffuse, sundiffuse, specular, ambient, getShadow(), ao); #if USE_SPECULAR_MAP && USE_SELF_LIGHT - color = mix(texdiffuse, color, specular.a); + color = mix(texdiffuse, color, emissionWeight); #endif color = applyFog(color, fogColor, fogParams);