From 88954a5d88a735cb1e9246b22b028f3ef3ab4e16 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 5 Oct 2014 02:12:04 +0200 Subject: [PATCH] Prepare shader for specmap value --- data/shaders/detailledobject_pass2.frag | 5 ++-- data/shaders/grass_pass2.frag | 19 +++++++------- .../instanced_detailledobject_pass2.frag | 5 ++-- data/shaders/instanced_grass_pass2.frag | 26 ++++++++++--------- data/shaders/instanced_object_pass2.frag | 5 ++-- .../instanced_objectpass_spheremap.frag | 5 ++-- data/shaders/instanced_objectref_pass2.frag | 5 ++-- data/shaders/object_pass2.frag | 5 ++-- data/shaders/objectpass_spheremap.frag | 5 ++-- data/shaders/objectref_pass2.frag | 5 ++-- data/shaders/splatting.frag | 5 ++-- data/shaders/utils/getLightFactor.frag | 4 +-- 12 files changed, 44 insertions(+), 50 deletions(-) diff --git a/data/shaders/detailledobject_pass2.frag b/data/shaders/detailledobject_pass2.frag index a426b6935..832a68f70 100644 --- a/data/shaders/detailledobject_pass2.frag +++ b/data/shaders/detailledobject_pass2.frag @@ -16,7 +16,7 @@ varying vec2 uv_bis; #define FragColor gl_FragColor #endif -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { @@ -28,6 +28,5 @@ void main(void) #endif vec4 detail = texture(Detail, uv_bis); color *= detail; - vec3 LightFactor = getLightFactor(1. - color.a); - FragColor = vec4(color.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(color.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/grass_pass2.frag b/data/shaders/grass_pass2.frag index 408e78365..10d747e1b 100644 --- a/data/shaders/grass_pass2.frag +++ b/data/shaders/grass_pass2.frag @@ -12,10 +12,18 @@ in vec3 nor; in vec2 uv; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { + vec4 color = texture(Albedo, uv); +#ifdef GL_ARB_bindless_texture +#ifdef SRGBBindlessFix + color.xyz = pow(color.xyz, vec3(2.2)); +#endif +#endif + if (color.a < 0.5) discard; + vec2 texc = gl_FragCoord.xy / screen; float z = texture(dtex, texc).x; @@ -31,13 +39,6 @@ void main(void) float fLdotNBack = max(0., - dot(nor, SunDir) * 0.6 + 0.4); float scattering = mix(fPowEdotL, fLdotNBack, .5); - vec4 color = texture(Albedo, uv); -#ifdef GL_ARB_bindless_texture -#ifdef SRGBBindlessFix - color.xyz = pow(color.xyz, vec3(2.2)); -#endif -#endif - if (color.a < 0.5) discard; - vec3 LightFactor = (scattering * 0.3) + getLightFactor(1.); + vec3 LightFactor = color.xyz * (scattering * 0.3) + getLightFactor(color.xyz, vec3(1.), 1.); FragColor = vec4(color.xyz * LightFactor, 1.); } diff --git a/data/shaders/instanced_detailledobject_pass2.frag b/data/shaders/instanced_detailledobject_pass2.frag index c631fe3ef..44790f61c 100644 --- a/data/shaders/instanced_detailledobject_pass2.frag +++ b/data/shaders/instanced_detailledobject_pass2.frag @@ -11,7 +11,7 @@ in vec2 uv; in vec2 uv_bis; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { @@ -26,6 +26,5 @@ void main(void) vec4 detail = texture(Detail, uv_bis); #endif color *= detail; - vec3 LightFactor = getLightFactor(1. - color.a); - FragColor = vec4(color.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(color.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/instanced_grass_pass2.frag b/data/shaders/instanced_grass_pass2.frag index b297a4c88..fd48f1012 100644 --- a/data/shaders/instanced_grass_pass2.frag +++ b/data/shaders/instanced_grass_pass2.frag @@ -14,10 +14,20 @@ in vec3 nor; in vec2 uv; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { +#ifdef GL_ARB_bindless_texture + vec4 color = texture(handle, uv); +#ifdef SRGBBindlessFix + color.xyz = pow(color.xyz, vec3(2.2)); +#endif +#else + vec4 color = texture(Albedo, uv); +#endif + if (color.a < 0.5) discard; + vec2 texc = gl_FragCoord.xy / screen; float z = texture(dtex, texc).x; @@ -33,15 +43,7 @@ void main(void) float fLdotNBack = max(0., - dot(nor, SunDir) * 0.6 + 0.4); float scattering = mix(fPowEdotL, fLdotNBack, .5); -#ifdef GL_ARB_bindless_texture - vec4 color = texture(handle, uv); -#ifdef SRGBBindlessFix - color.xyz = pow(color.xyz, vec3(2.2)); -#endif -#else - vec4 color = texture(Albedo, uv); -#endif - if (color.a < 0.5) discard; - vec3 LightFactor = (scattering * 0.3) + getLightFactor(1.); - FragColor = vec4(color.xyz * LightFactor, 1.); + + vec3 LightFactor = color.xyz * (scattering * 0.3) + getLightFactor(color.xyz, vec3(1.), 1.); + FragColor = vec4(LightFactor, 1.); } diff --git a/data/shaders/instanced_object_pass2.frag b/data/shaders/instanced_object_pass2.frag index 76176ba37..feebe72f2 100644 --- a/data/shaders/instanced_object_pass2.frag +++ b/data/shaders/instanced_object_pass2.frag @@ -9,7 +9,7 @@ in vec2 uv; in vec4 color; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { @@ -22,6 +22,5 @@ void main(void) vec4 col = texture(Albedo, uv); #endif col.xyz *= pow(color.xyz, vec3(2.2)); - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(col.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(col.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/instanced_objectpass_spheremap.frag b/data/shaders/instanced_objectpass_spheremap.frag index 5365dd7ef..50ce74fb6 100644 --- a/data/shaders/instanced_objectpass_spheremap.frag +++ b/data/shaders/instanced_objectpass_spheremap.frag @@ -12,7 +12,7 @@ out vec4 FragColor; vec4 getPosFromUVDepth(vec3 uvDepth, mat4 InverseProjectionMatrix); -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main() { vec3 texc = gl_FragCoord.xyz / vec3(screen, 1.); @@ -29,7 +29,6 @@ void main() { #else vec4 detail0 = texture(tex, r.xy / m + .5); #endif - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(detail0.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(detail0.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/instanced_objectref_pass2.frag b/data/shaders/instanced_objectref_pass2.frag index 201f610a1..045706254 100644 --- a/data/shaders/instanced_objectref_pass2.frag +++ b/data/shaders/instanced_objectref_pass2.frag @@ -9,7 +9,7 @@ in vec2 uv; in vec4 color; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { @@ -23,6 +23,5 @@ void main(void) #endif col.xyz *= pow(color.xyz, vec3(2.2)); if (col.a * color.a < 0.5) discard; - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(col.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(col.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/object_pass2.frag b/data/shaders/object_pass2.frag index 047f0a192..53341f689 100644 --- a/data/shaders/object_pass2.frag +++ b/data/shaders/object_pass2.frag @@ -8,7 +8,7 @@ in vec2 uv; in vec4 color; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { @@ -21,6 +21,5 @@ void main(void) vec4 col = texture(Albedo, uv); #endif col.xyz *= pow(color.xyz, vec3(2.2)); - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(col.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(color.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/objectpass_spheremap.frag b/data/shaders/objectpass_spheremap.frag index 8e4e0f4fc..5e1400a3d 100644 --- a/data/shaders/objectpass_spheremap.frag +++ b/data/shaders/objectpass_spheremap.frag @@ -15,7 +15,7 @@ varying vec3 nor; #endif vec4 getPosFromUVDepth(vec3 uvDepth, mat4 InverseProjectionMatrix); -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main() { vec3 texc = gl_FragCoord.xyz / vec3(screen, 1.); @@ -30,7 +30,6 @@ void main() { detail0.xyz = pow(detail0.xyz, vec3(2.2)); #endif #endif - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(detail0.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(detail0.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/objectref_pass2.frag b/data/shaders/objectref_pass2.frag index 13ff676f8..d6b2d1f1c 100644 --- a/data/shaders/objectref_pass2.frag +++ b/data/shaders/objectref_pass2.frag @@ -8,7 +8,7 @@ in vec2 uv; in vec4 color; out vec4 FragColor; -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main(void) { @@ -20,6 +20,5 @@ void main(void) #endif col.xyz *= pow(color.xyz, vec3(2.2)); if (col.a * color.a < 0.5) discard; - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(col.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(color.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/splatting.frag b/data/shaders/splatting.frag index d302908d2..3641c8d40 100644 --- a/data/shaders/splatting.frag +++ b/data/shaders/splatting.frag @@ -22,7 +22,7 @@ varying vec2 uv_bis; #define FragColor gl_FragColor #endif -vec3 getLightFactor(float specMapValue); +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue); void main() { // Splatting part @@ -46,6 +46,5 @@ void main() { splatting.b * detail2 + max(0., (1.0 - splatting.r - splatting.g - splatting.b)) * detail3; - vec3 LightFactor = getLightFactor(1.); - FragColor = vec4(splatted.xyz * LightFactor, 1.); + FragColor = vec4(getLightFactor(splatted.xyz, vec3(1.), 1.), 1.); } diff --git a/data/shaders/utils/getLightFactor.frag b/data/shaders/utils/getLightFactor.frag index 9bf4cdf58..8c04c7694 100644 --- a/data/shaders/utils/getLightFactor.frag +++ b/data/shaders/utils/getLightFactor.frag @@ -8,12 +8,12 @@ uniform sampler2D SpecularMap; uniform sampler2D SSAO; #endif -vec3 getLightFactor(float specMapValue) +vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue) { vec2 tc = gl_FragCoord.xy / screen; vec3 DiffuseComponent = texture(DiffuseMap, tc).xyz; vec3 SpecularComponent = texture(SpecularMap, tc).xyz; float ao = texture(SSAO, tc).x; - vec3 tmp = DiffuseComponent + SpecularComponent * specMapValue; + vec3 tmp = diffuseMatColor * DiffuseComponent + specularMatColor * SpecularComponent * specMapValue; return tmp * ao; } \ No newline at end of file