summaryrefslogtreecommitdiff
path: root/drivers/gles2/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles2/shaders')
-rw-r--r--drivers/gles2/shaders/copy.glsl75
-rw-r--r--drivers/gles2/shaders/material.glsl60
2 files changed, 102 insertions, 33 deletions
diff --git a/drivers/gles2/shaders/copy.glsl b/drivers/gles2/shaders/copy.glsl
index f96ec1d1bd..d8fb03f3a3 100644
--- a/drivers/gles2/shaders/copy.glsl
+++ b/drivers/gles2/shaders/copy.glsl
@@ -78,7 +78,7 @@ uniform highp float hdr_glow_scale;
uniform sampler2D hdr_source;
uniform highp float tonemap_exposure;
-
+uniform highp float tonemap_white;
#endif
#ifdef USE_BCS
@@ -318,6 +318,7 @@ void main() {
#ifdef USE_HDR
+ highp float white_mult = 1.0;
#ifdef USE_8BIT_HDR
highp vec4 _mult = vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1);
@@ -325,11 +326,37 @@ void main() {
color.rgb*=LUM_RANGE;
hdr_lum*=LUM_RANGE; //restore to full range
#else
- highp float hdr_lum = texture2D( hdr_source, vec2(0.0) ).r;
+
+ highp vec2 lv = texture2D( hdr_source, vec2(0.0) ).rg;
+ highp float hdr_lum = lv.r;
+#ifdef USE_AUTOWHITE
+ white_mult=lv.g;
+#endif
+
#endif
+#ifdef USE_REINHARDT_TONEMAPPER
+ float src_lum = dot(color.rgb,vec3(0.3, 0.58, 0.12));
+ float lp = tonemap_exposure/hdr_lum*src_lum;
+ float white = tonemap_white;
+#ifdef USE_AUTOWHITE
+ white_mult = (white_mult + 1.0 * white_mult);
+ white_mult*=white_mult;
+ white*=white_mult;
+#endif
+ lp = ( lp * ( 1.0 + ( lp / ( white) ) ) ) / ( 1.0 + lp );
+ color.rgb*=lp;
+
+#else
+
+#ifdef USE_LOG_TONEMAPPER
+ color.rgb = tonemap_exposure * log(color.rgb+1.0)/log(hdr_lum+1.0);
+#else
highp float tone_scale = tonemap_exposure / hdr_lum; //only linear supported
color.rgb*=tone_scale;
+#endif
+
+#endif
#endif
@@ -393,7 +420,11 @@ void main() {
#ifdef USE_HDR_COPY
//highp float lum = dot(color.rgb,highp vec3(1.0/3.0,1.0/3.0,1.0/3.0));
- highp float lum = max(color.r,max(color.g,color.b));
+ //highp float lum = max(color.r,max(color.g,color.b));
+ highp float lum = dot(color.rgb,vec3(0.3, 0.58, 0.12));
+
+ //lum=log(lum+0.0001); //everyone does it
+
#ifdef USE_8BIT_HDR
highp vec4 comp = fract(lum * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0));
comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
@@ -422,21 +453,33 @@ void main() {
#else
highp float lum_accum = color.r;
- lum_accum += texture2D( source, uv_interp+vec2(-pixel_size.x,-pixel_size.y) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(0.0,-pixel_size.y) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(pixel_size.x,-pixel_size.y) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(-pixel_size.x,0.0) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(pixel_size.x,0.0) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(-pixel_size.x,pixel_size.y) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(0.0,pixel_size.y) ).r;
- lum_accum += texture2D( source, uv_interp+vec2(pixel_size.x,pixel_size.y) ).r;
+ highp float lum_max = color.g;
+
+#define LUM_REDUCE(m_uv) \
+ {\
+ vec2 val = texture2D( source, uv_interp+m_uv ).rg;\
+ lum_accum+=val.x;\
+ lum_max=max(val.y,lum_max);\
+ }
+
+ LUM_REDUCE( vec2(-pixel_size.x,-pixel_size.y) );
+ LUM_REDUCE( vec2(0.0,-pixel_size.y) );
+ LUM_REDUCE( vec2(pixel_size.x,-pixel_size.y) );
+ LUM_REDUCE( vec2(-pixel_size.x,0.0) );
+ LUM_REDUCE( vec2(pixel_size.x,0.0) );
+ LUM_REDUCE( vec2(-pixel_size.x,pixel_size.y) );
+ LUM_REDUCE( vec2(0.0,pixel_size.y) );
+ LUM_REDUCE( vec2(pixel_size.x,pixel_size.y) );
lum_accum/=9.0;
#endif
#ifdef USE_HDR_STORE
-#ifdef USE_8BIT_HDR
+ //lum_accum=exp(lum_accum);
+
+#ifdef USE_8BIT_HDR
+
highp float vd_lum = dot(texture2D( source_vd_lum, vec2(0.0) ), _multcv );
lum_accum = clamp( vd_lum + (lum_accum-vd_lum)*hdr_time_delta*hdr_exp_adj_speed,min_luminance*(1.0/LUM_RANGE),max_luminance*(1.0/LUM_RANGE));
#else
@@ -451,12 +494,20 @@ void main() {
comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
color=comp;
#else
+#ifdef USE_AUTOWHITE
+ color.r=lum_accum;
+ color.g=lum_max;
+#else
color.rgb=vec3(lum_accum);
#endif
#endif
+#endif
+
+
+
#ifdef USE_RGBE
color.rgb = pow(color.rgb,color.a*255.0-(8.0+128.0));
diff --git a/drivers/gles2/shaders/material.glsl b/drivers/gles2/shaders/material.glsl
index 8e7d321fe7..602620a04b 100644
--- a/drivers/gles2/shaders/material.glsl
+++ b/drivers/gles2/shaders/material.glsl
@@ -115,7 +115,6 @@ uniform vec3 light_pos;
uniform vec3 light_direction;
uniform vec3 light_attenuation;
uniform vec3 light_spot_attenuation;
-uniform vec3 light_ambient;
uniform vec3 light_diffuse;
uniform vec3 light_specular;
@@ -132,6 +131,7 @@ varying vec3 specular_interp;
uniform float time;
uniform float instance_id;
+uniform vec3 ambient_light;
#if !defined(USE_DEPTH_SHADOWS) && defined(USE_SHADOW_PASS)
@@ -404,7 +404,7 @@ VERTEX_SHADER_CODE
float NdotL = max(0.0,dot( normal_interp, light_dir ));
vec3 half_vec = normalize(light_dir + eye_vec);
float eye_light = max(dot(normal_interp, half_vec),0.0);
- diffuse_interp.rgb=light_diffuse * NdotL * attenuation;// + light_ambient;
+ diffuse_interp.rgb=light_diffuse * NdotL * attenuation;
diffuse_interp.a=attenuation;
if (NdotL > 0.0) {
specular_interp=light_specular * pow( eye_light, vertex_specular_exp ) * attenuation;
@@ -510,27 +510,15 @@ uniform vec3 light_pos;
uniform vec3 light_direction;
uniform vec3 light_attenuation;
uniform vec3 light_spot_attenuation;
-uniform vec3 light_ambient;
uniform vec3 light_diffuse;
uniform vec3 light_specular;
-
-#ifdef USE_FRAGMENT_LIGHTING
+uniform vec3 ambient_light;
+#ifdef USE_FRAGMENT_LIGHTING
-vec3 process_shade(in vec3 normal, in vec3 light_dir, in vec3 eye_vec, in vec3 diffuse, in vec3 specular, in float specular_exp, in float attenuation) {
- float NdotL = max(0.0,dot( normal, light_dir ));
- vec3 half_vec = normalize(light_dir + eye_vec);
- float eye_light = max(dot(normal, half_vec),0.0);
-
- vec3 ret = light_ambient *diffuse + light_diffuse * diffuse * NdotL * attenuation;
- if (NdotL > 0.0) {
- ret+=light_specular * specular * pow( eye_light, specular_exp ) * attenuation;
- }
- return ret;
-}
# ifdef USE_DEPTH_SHADOWS
# else
@@ -770,9 +758,12 @@ void main() {
bool discard_=false;
#endif
+{
+
FRAGMENT_SHADER_CODE
+}
#if defined(ENABLE_DISCARD)
if (discard_) {
@@ -1009,9 +1000,8 @@ FRAGMENT_SHADER_CODE
#ifdef LIGHT_TYPE_DIRECTIONAL
vec3 light_dir = -light_direction;
- float light_attenuation = light_attenuation.r;
+ float attenuation = light_attenuation.r;
- diffuse.rgb=process_shade(normal,light_dir,eye_vec,diffuse.rgb,specular,specular_exp,shadow_attenuation)*light_attenuation;
#endif
@@ -1023,7 +1013,6 @@ FRAGMENT_SHADER_CODE
light_dir=normalize(light_dir);
float attenuation = pow( max(1.0 - dist/radius, 0.0), light_attenuation.b ) * light_attenuation.r;
- diffuse.rgb=process_shade(normal,light_dir,eye_vec,diffuse.rgb,specular,specular_exp,shadow_attenuation)*attenuation;
#endif
@@ -1040,10 +1029,39 @@ FRAGMENT_SHADER_CODE
float rim = (1.0 - scos) / (1.0 - spot_cutoff);
attenuation *= 1.0 - pow( rim, light_spot_attenuation.g);
- diffuse.rgb=process_shade(normal,light_dir,eye_vec,diffuse.rgb,specular,specular_exp,shadow_attenuation)*attenuation;
+#endif
+
+# if defined(LIGHT_TYPE_DIRECTIONAL) || defined(LIGHT_TYPE_OMNI) || defined (LIGHT_TYPE_SPOT)
+
+ {
+
+ vec3 mdiffuse = diffuse.rgb;
+ vec3 light;
+
+#if defined(USE_LIGHT_SHADER_CODE)
+//light is written by the light shader
+{
+
+LIGHT_SHADER_CODE
+
+}
+#else
+//traditional lambert + blinn
+ float NdotL = max(0.0,dot( normal, light_dir ));
+ vec3 half_vec = normalize(light_dir + eye_vec);
+ float eye_light = max(dot(normal, half_vec),0.0);
+ light = light_diffuse * mdiffuse * NdotL;
+ if (NdotL > 0.0) {
+ light+=specular * light_specular * pow( eye_light, specular_exp );
+ }
#endif
+ diffuse.rgb = ambient_light *diffuse.rgb + light * attenuation * shadow_attenuation;
+
+ }
+
+# endif
# if !defined(LIGHT_TYPE_DIRECTIONAL) && !defined(LIGHT_TYPE_OMNI) && !defined (LIGHT_TYPE_SPOT)
//none
@@ -1062,7 +1080,7 @@ FRAGMENT_SHADER_CODE
#ifdef USE_VERTEX_LIGHTING
- vec3 ambient = light_ambient*diffuse.rgb;
+ vec3 ambient = ambient_light*diffuse.rgb;
# if defined(LIGHT_TYPE_OMNI) || defined (LIGHT_TYPE_SPOT)
ambient*=diffuse_interp.a; //attenuation affects ambient too
# endif