summaryrefslogtreecommitdiff
path: root/drivers/gles2/shaders/copy.glsl
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2014-02-09 22:10:30 -0300
committerJuan Linietsky <reduzio@gmail.com>2014-02-09 22:10:30 -0300
commit0b806ee0fc9097fa7bda7ac0109191c9c5e0a1ac (patch)
tree276c4d099e178eb67fbd14f61d77b05e3808e9e3 /drivers/gles2/shaders/copy.glsl
parent0e49da1687bc8192ed210947da52c9e5c5f301bb (diff)
GODOT IS OPEN SOURCE
Diffstat (limited to 'drivers/gles2/shaders/copy.glsl')
-rw-r--r--drivers/gles2/shaders/copy.glsl253
1 files changed, 253 insertions, 0 deletions
diff --git a/drivers/gles2/shaders/copy.glsl b/drivers/gles2/shaders/copy.glsl
new file mode 100644
index 0000000000..2ed19cbd65
--- /dev/null
+++ b/drivers/gles2/shaders/copy.glsl
@@ -0,0 +1,253 @@
+[vertex]
+
+#ifdef USE_GLES_OVER_GL
+#define mediump
+#define highp
+#else
+precision mediump float;
+precision mediump int;
+#endif
+
+attribute highp vec4 vertex_attrib; // attrib:0
+#ifdef USE_CUBEMAP
+attribute vec3 cube_in; // attrib:4
+#else
+attribute vec2 uv_in; // attrib:4
+#endif
+attribute vec2 uv2_in; // attrib:5
+
+#ifdef USE_CUBEMAP
+varying vec3 cube_interp;
+#else
+varying vec2 uv_interp;
+#endif
+
+varying vec2 uv2_interp;
+
+void main() {
+
+#ifdef USE_CUBEMAP
+ cube_interp = cube_in;
+#else
+ uv_interp = uv_in;
+#endif
+ uv2_interp = uv2_in;
+ gl_Position = vertex_attrib;
+}
+
+[fragment]
+
+#ifdef USE_GLES_OVER_GL
+#define mediump
+#define highp
+#else
+precision mediump float;
+precision mediump int;
+#endif
+
+
+#define LUM_RANGE 4.0
+
+
+#ifdef USE_CUBEMAP
+varying vec3 cube_interp;
+uniform samplerCube source_cube;
+#else
+varying vec2 uv_interp;
+uniform sampler2D source;
+#endif
+varying vec2 uv2_interp;
+
+#ifdef USE_GLOW
+
+uniform sampler2D glow_source;
+
+#endif
+
+
+#if defined(USE_HDR) && defined(USE_GLOW_COPY)
+uniform highp float hdr_glow_treshold;
+uniform highp float hdr_glow_scale;
+#endif
+
+#ifdef USE_HDR
+
+uniform sampler2D hdr_source;
+uniform highp float tonemap_exposure;
+
+#endif
+
+#ifdef USE_BCS
+
+uniform vec3 bcs;
+
+#endif
+
+#ifdef USE_GAMMA
+
+uniform float gamma;
+
+#endif
+
+#ifdef USE_GLOW_COPY
+
+uniform float bloom;
+uniform float bloom_treshold;
+
+#endif
+
+#if defined(BLUR_V_PASS) || defined(BLUR_H_PASS) || defined(USE_HDR_REDUCE)
+
+uniform vec2 pixel_size;
+
+#ifdef USE_HDR_STORE
+
+uniform highp float hdr_time_delta;
+uniform highp float hdr_exp_adj_speed;
+uniform highp float min_luminance;
+uniform highp float max_luminance;
+uniform sampler2D source_vd_lum;
+
+#endif
+
+#endif
+
+#ifdef USE_ENERGY
+
+uniform highp float energy;
+
+#endif
+
+
+void main() {
+
+ //vec4 color = color_interp;
+#ifdef USE_CUBEMAP
+ vec4 color = textureCube( source_cube, normalize(cube_interp) );
+
+#else
+ vec4 color = texture2D( source, uv_interp );
+#endif
+
+ //color.rg=uv_interp;
+
+#ifdef USE_BCS
+
+ color.rgb = mix(vec3(0.0),color.rgb,bcs.x);
+ color.rgb = mix(vec3(0.5),color.rgb,bcs.y);
+ color.rgb = mix(vec3(dot(vec3(1.0),color.rgb)*0.33333),color.rgb,bcs.z);
+
+#endif
+
+#ifdef BLUR_V_PASS
+
+ color+=texture2D(source,uv_interp+vec2(0.0,pixel_size.y*-3.0));
+ color+=texture2D(source,uv_interp+vec2(0.0,pixel_size.y*-2.0));
+ color+=texture2D(source,uv_interp+vec2(0.0,pixel_size.y*-1.0));
+ color+=texture2D(source,uv_interp+vec2(0.0,pixel_size.y*1.0));
+ color+=texture2D(source,uv_interp+vec2(0.0,pixel_size.y*2.0));
+ color+=texture2D(source,uv_interp+vec2(0.0,pixel_size.y*3.0));
+
+ color*=(1.0/7.0);
+
+#endif
+
+#ifdef BLUR_H_PASS
+
+
+ color+=texture2D(source,uv_interp+vec2(pixel_size.x*-3.0,0.0));
+ color+=texture2D(source,uv_interp+vec2(pixel_size.x*-2.0,0.0));
+ color+=texture2D(source,uv_interp+vec2(pixel_size.x*-1.0,0.0));
+ color+=texture2D(source,uv_interp+vec2(pixel_size.x*1.0,0.0));
+ color+=texture2D(source,uv_interp+vec2(pixel_size.x*2.0,0.0));
+ color+=texture2D(source,uv_interp+vec2(pixel_size.x*3.0,0.0));
+
+ color*=(1.0/7.0);
+
+#endif
+
+#ifdef USE_HDR
+
+ highp vec4 _mult = vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1);
+ highp float hdr_lum = dot(texture2D( hdr_source, vec2(0.0) ), _mult );
+ color.rgb*=LUM_RANGE;
+ hdr_lum*=LUM_RANGE; //restore to full range
+ highp float tone_scale = tonemap_exposure / hdr_lum; //only linear supported
+ color.rgb*=tone_scale;
+
+#endif
+
+#ifdef USE_GLOW_COPY
+
+ highp vec3 glowcol = color.rgb*color.a+step(bloom_treshold,dot(vec3(0.3333,0.3333,0.3333),color.rgb))*bloom*color.rgb;
+
+#ifdef USE_HDR
+ highp float collum = max(color.r,max(color.g,color.b));
+ glowcol+=color.rgb*max(collum-hdr_glow_treshold,0.0)*hdr_glow_scale;
+#endif
+ color.rgb=glowcol;
+ color.a=0.0;
+
+#endif
+
+
+#ifdef USE_GLOW
+
+ vec4 glow = texture2D( glow_source, uv2_interp );
+
+ color.rgb+=glow.rgb;
+
+#endif
+
+#ifdef USE_GAMMA
+
+ color.rgb = pow(color.rgb,gamma);
+
+#endif
+
+
+#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 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);
+ color=comp;
+#endif
+
+#ifdef USE_HDR_REDUCE
+
+ highp vec4 _multcv = vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0, 1.0);
+ highp float lum_accum = dot(color,_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(-pixel_size.x,-pixel_size.y) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(0.0,-pixel_size.y) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(pixel_size.x,-pixel_size.y) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(-pixel_size.x,0.0) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(pixel_size.x,0.0) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(-pixel_size.x,pixel_size.y) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(0.0,pixel_size.y) ),_multcv );
+ lum_accum += dot(texture2D( source, uv_interp+vec2(pixel_size.x,pixel_size.y) ),_multcv );
+ lum_accum/=9.0;
+
+#ifdef USE_HDR_STORE
+
+ 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));
+#endif
+
+ highp vec4 comp = fract(lum_accum * 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);
+ color=comp;
+#endif
+
+#ifdef USE_RGBE
+
+ color.rgb = pow(color.rgb,color.a*255.0-(8.0+128.0));
+#endif
+
+#ifdef USE_ENERGY
+ color.rgb*=energy;
+#endif
+ gl_FragColor = color;
+}
+