summaryrefslogtreecommitdiff
path: root/drivers/gles3/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles3/shaders')
-rw-r--r--drivers/gles3/shaders/copy.glsl27
-rw-r--r--drivers/gles3/shaders/cubemap_filter.glsl2
-rw-r--r--drivers/gles3/shaders/scene.glsl70
3 files changed, 79 insertions, 20 deletions
diff --git a/drivers/gles3/shaders/copy.glsl b/drivers/gles3/shaders/copy.glsl
index eb58d66431..79982ecf25 100644
--- a/drivers/gles3/shaders/copy.glsl
+++ b/drivers/gles3/shaders/copy.glsl
@@ -5,9 +5,9 @@ layout(location=0) in highp vec4 vertex_attrib;
#ifdef USE_CUBEMAP
layout(location=4) in vec3 cube_in;
#else
-layout(location=4) in vec2 uv_in; // attrib:4
+layout(location=4) in vec2 uv_in;
#endif
-layout(location=5) in vec2 uv2_in; // attrib:5
+layout(location=5) in vec2 uv2_in;
#ifdef USE_CUBEMAP
out vec3 cube_interp;
@@ -40,6 +40,15 @@ uniform sampler2D source; //texunit:0
#endif
+float sRGB_gamma_correct(float c){
+ float a = 0.055;
+ if(c < 0.0031308)
+ return 12.92*c;
+ else
+ return (1.0+a)*pow(c, 1.0/2.4) - a;
+}
+
+
uniform float stuff;
in vec2 uv2_interp;
@@ -57,6 +66,20 @@ void main() {
vec4 color = texture( source, uv_interp );
#endif
+#ifdef LINEAR_TO_SRGB
+ //regular Linear -> SRGB conversion
+ vec3 a = vec3(0.055);
+ color.rgb = mix( (vec3(1.0)+a)*pow(color.rgb,vec3(1.0/2.4))-a , 12.92*color.rgb , lessThan(color.rgb,vec3(0.0031308)));
+#endif
+
+#ifdef DEBUG_GRADIENT
+ color.rg=uv_interp;
+ color.b=0.0;
+#endif
+
+#ifdef DISABLE_ALPHA
+ color.a=1.0;
+#endif
frag_color = color;
}
diff --git a/drivers/gles3/shaders/cubemap_filter.glsl b/drivers/gles3/shaders/cubemap_filter.glsl
index d3d4cbd435..998a59833e 100644
--- a/drivers/gles3/shaders/cubemap_filter.glsl
+++ b/drivers/gles3/shaders/cubemap_filter.glsl
@@ -3,7 +3,7 @@
layout(location=0) in highp vec2 vertex;
-layout(location=1) in highp vec2 uv;
+layout(location=4) in highp vec2 uv;
out highp vec2 uv_interp;
diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl
index 3f94252606..60ac015a17 100644
--- a/drivers/gles3/shaders/scene.glsl
+++ b/drivers/gles3/shaders/scene.glsl
@@ -269,11 +269,16 @@ in vec3 normal_interp;
/* PBR CHANNELS */
+//used on forward mainly
+uniform bool no_ambient_light;
+
+
#ifdef USE_RADIANCE_CUBEMAP
uniform sampler2D brdf_texture; //texunit:-1
uniform samplerCube radiance_cube; //texunit:-2
+
layout(std140) uniform Radiance { //ubo:2
mat4 radiance_inverse_xform;
@@ -346,8 +351,18 @@ in mediump vec4 forward_shadow_pos4;
#endif
+#ifdef USE_MULTIPLE_RENDER_TARGETS
+
+layout(location=0) out vec4 diffuse_buffer;
+layout(location=1) out vec4 specular_buffer;
+layout(location=2) out vec4 normal_mr_buffer;
+
+#else
+
layout(location=0) out vec4 frag_color;
+#endif
+
// GGX Specular
// Source: http://www.filmicworlds.com/images/ggx-opt/optimized-ggx.hlsl
@@ -470,39 +485,46 @@ FRAGMENT_SHADER_CODE
/////////////////////// LIGHTING //////////////////////////////
vec3 specular_light = vec3(0.0,0.0,0.0);
- vec3 ambient_light = ambient_light_color.rgb;
+ vec3 ambient_light;
vec3 diffuse_light = vec3(0.0,0.0,0.0);
vec3 eye_vec = -normalize( vertex_interp );
#ifdef USE_RADIANCE_CUBEMAP
- {
+ if (no_ambient_light) {
+ ambient_light=vec3(0.0,0.0,0.0);
+ } else {
+ {
- float ndotv = clamp(dot(normal,eye_vec),0.0,1.0);
- vec2 brdf = texture(brdf_texture, vec2(roughness, ndotv)).xy;
+ float ndotv = clamp(dot(normal,eye_vec),0.0,1.0);
+ vec2 brdf = texture(brdf_texture, vec2(roughness, ndotv)).xy;
- float lod = roughness * 5.0;
- vec3 r = reflect(-eye_vec,normal); //2.0 * ndotv * normal - view; // reflect(v, n);
- r=normalize((radiance_inverse_xform * vec4(r,0.0)).xyz);
- vec3 radiance = textureLod(radiance_cube, r, lod).xyz * ( brdf.x + brdf.y);
+ float lod = roughness * 5.0;
+ vec3 r = reflect(-eye_vec,normal); //2.0 * ndotv * normal - view; // reflect(v, n);
+ r=normalize((radiance_inverse_xform * vec4(r,0.0)).xyz);
+ vec3 radiance = textureLod(radiance_cube, r, lod).xyz * ( brdf.x + brdf.y);
- specular_light=mix(albedo,radiance,specular);
+ specular_light=mix(albedo,radiance,specular);
- }
+ }
- {
+ {
- vec3 ambient_dir=normalize((radiance_inverse_xform * vec4(normal,0.0)).xyz);
- vec3 env_ambient=textureLod(radiance_cube, ambient_dir, 5.0).xyz;
+ vec3 ambient_dir=normalize((radiance_inverse_xform * vec4(normal,0.0)).xyz);
+ vec3 env_ambient=textureLod(radiance_cube, ambient_dir, 5.0).xyz;
- ambient_light=mix(ambient_light,env_ambient,radiance_ambient_contribution);
+ ambient_light=mix(ambient_light_color.rgb,env_ambient,radiance_ambient_contribution);
+ }
}
-
#else
- ambient_light=albedo;
+ if (no_ambient_light){
+ ambient_light=vec3(0.0,0.0,0.0);
+ } else {
+ ambient_light=ambient_light_color.rgb;
+ }
#endif
@@ -538,11 +560,25 @@ LIGHT_SHADER_CODE
}
#endif
-#ifdef SHADELESS
+#ifdef USE_MULTIPLE_RENDER_TARGETS
+
+ //approximate ambient scale for SSAO, since we will lack full ambient
+ float max_ambient=max(ambient_light.r,max(ambient_light.g,ambient_light.b));
+ float max_diffuse=max(diffuse_light.r,max(diffuse_light.g,diffuse_light.b));
+ float total_ambient = max_ambient+max_diffuse;
+ float ambient_scale = (total_ambient>0.0) ? max_ambient/total_ambient : 0.0;
+ diffuse_buffer=vec4(diffuse_light+ambient_light,ambient_scale);
+ specular_buffer=vec4(specular_light,0.0);
+ normal_mr_buffer=vec4(normal.x,normal.y,max(specular.r,max(specular.g,specular.b)),roughness);
+
+#else
+
+#ifdef SHADELESS
frag_color=vec4(albedo,alpha);
#else
frag_color=vec4(ambient_light+diffuse_light+specular_light,alpha);
+#endif
#endif