diff --git a/java/examples/Topics/Shaders/Deform/Deform.pde b/java/examples/Topics/Shaders/Deform/Deform.pde new file mode 100644 index 000000000..2c15d428c --- /dev/null +++ b/java/examples/Topics/Shaders/Deform/Deform.pde @@ -0,0 +1,19 @@ +PImage tex; +PShader deform; + +void setup() { + size(512, 384, P2D); + + textureWrap(REPEAT); + tex = loadImage("tex1.jpg"); + + deform = loadShader("deform.glsl"); + deform.set("resolution", float(width), float(height)); +} + +void draw() { + deform.set("time", millis() / 1000.0); + deform.set("mouse", float(mouseX), float(mouseY)); + shader(deform); + image(tex, 0, 0, width, height); +} diff --git a/java/examples/Topics/Shaders/Deform/data/deform.glsl b/java/examples/Topics/Shaders/Deform/data/deform.glsl new file mode 100644 index 000000000..0b9bffb5d --- /dev/null +++ b/java/examples/Topics/Shaders/Deform/data/deform.glsl @@ -0,0 +1,24 @@ +uniform sampler2D textureSampler; + +uniform float time; +uniform vec2 resolution; +uniform vec2 mouse; + +void main(void) { + vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy; + vec2 m = -1.0 + 2.0 * mouse.xy / resolution.xy; + + float a1 = atan(p.y - m.y, p.x - m.x); + float r1 = sqrt(dot(p - m, p - m)); + float a2 = atan(p.y + m.y, p.x + m.x); + float r2 = sqrt(dot(p + m, p + m)); + + vec2 uv; + uv.x = 0.2 * time + (r1 - r2) * 0.25; + uv.y = sin(2.0 * (a1 - a2)); + + float w = r1 * r2 * 0.8; + vec3 col = texture2D(textureSampler, 0.5 - 0.495 * uv).xyz; + + gl_FragColor = vec4(col / (0.1 + w), 1.0); +} \ No newline at end of file diff --git a/java/examples/Topics/Shaders/Landscape/Landscape.pde b/java/examples/Topics/Shaders/Landscape/Landscape.pde new file mode 100644 index 000000000..8b508d172 --- /dev/null +++ b/java/examples/Topics/Shaders/Landscape/Landscape.pde @@ -0,0 +1,16 @@ +PShader landscape; + +void setup() { + size(320, 240, P2D); + + landscape = loadShader("landscape.glsl"); + landscape.set("resolution", float(width), float(height)); + noStroke(); +} + +void draw() { + landscape.set("time", millis() / 1000.0); + landscape.set("mouse", float(mouseX), height - float(mouseY)); + shader(landscape); + rect(0, 0, width, height); +} diff --git a/java/examples/Topics/Shaders/Landscape/data/landscape.glsl b/java/examples/Topics/Shaders/Landscape/data/landscape.glsl new file mode 100644 index 000000000..fc0ce0ac6 --- /dev/null +++ b/java/examples/Topics/Shaders/Landscape/data/landscape.glsl @@ -0,0 +1,220 @@ + // Some hills... +// rotwang: @mod* lowered cam for better flight feeling +// @mod+ mouse y controls flight height +// @mod* some color tests +// @mod+ Canyon +// @emackey: Simple sky blue (no clouds...) +// @rotwang: mod* sky gradient, different terrain front and backcolor +// @mod* stripes texture +// @mod* terrain variation +// @psonice flyover adjusted so height depends on terrain. WOuld be better with spline interpolation, if you have the time go do it :) +#ifdef GL_ES +precision highp float; +#endif + + +uniform vec2 resolution; +uniform float time; +uniform vec2 mouse; +//Simple raymarching sandbox with camera + +//Raymarching Distance Fields +//About http://www.iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm +//Also known as Sphere Tracing +//Original seen here: http://twitter.com/#!/paulofalcao/statuses/134807547860353024 + +//Util Start + +mat2 m = mat2( 0.80, 0.60, -0.60, 0.80 ); + +float hash( float n ) +{ + return fract(sin(n)*43758.5453); +} + +float noise( in vec2 x ) +{ + vec2 p = floor(x); + vec2 f = fract(x); + f = f*f*(3.0-2.0*f); + float n = p.x + p.y*57.0; + float res = mix(mix( hash(n+ 0.0), hash(n+ 1.0),f.x), mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y); + return res; +} + +float fbm_5oct( vec2 p ) +{ + float f = 0.0; + f += 0.50000*noise( p ); p = m*p*2.02; + f += 0.25000*noise( p ); p = m*p*2.03; + f += 0.12500*noise( p ); p = m*p*2.01; + f += 0.06250*noise( p ); p = m*p*2.04; + f += 0.03125*noise( p ); + return f/0.984375; +} + +float fbm_3oct( vec2 p ) +{ + float f = 0.0; + f += 0.50000*noise( p ); p = m*p*2.02; + f += 0.25000*noise( p ); p = m*p*2.03; + f += 0.12500*noise( p ); p = m*p*2.01; + + return f/0.875; +} + +vec2 ObjUnion(in vec2 obj_floor,in vec2 obj_roundBox){ + if (obj_floor.xMAX_DEPTH) break; + f+=s.x; + p=E+scp*f; + s=inObj(p); + } + + if (f 0.5) { + gl_FragColor = live; + } else { + gl_FragColor = dead; + } + } else { + int sum = 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(-1., -1.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(-1., 0.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(-1., 1.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(1., -1.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(1., 0.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(1., 1.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(0., -1.)).g > 0.9) ? 1 : 0; + sum += (texture2D(backbufferSampler, position + pixel * vec2(0., 1.)).g > 0.9) ? 1 : 0; + vec4 me = texture2D(backbufferSampler, position); + + if (me.g <= 0.9) { + if (sum == 3) { + gl_FragColor = live; + } else if ((me.b > 0.2) || (me.b < 0.01)) { + gl_FragColor = dirt; + } else { + if (me.r > decay.r) { me.r -= 0.004; } + else if (me.g > decay.g) { me.g -= 0.004; } + else if (me.b < decay.b) { me.b += 0.004; } + else { me = decay; } + gl_FragColor = me; + } + } else { + if ((sum == 2) || (sum == 3)) { + gl_FragColor = live; + } else { + gl_FragColor = dead; + } + } + } +} \ No newline at end of file diff --git a/java/examples/Topics/Shaders/Monjori/Monjori.pde b/java/examples/Topics/Shaders/Monjori/Monjori.pde new file mode 100644 index 000000000..c260b5b4d --- /dev/null +++ b/java/examples/Topics/Shaders/Monjori/Monjori.pde @@ -0,0 +1,18 @@ +PShader monjori; + +void setup() { + size(512, 384, P2D); + noStroke(); + + monjori = loadShader("monjori.glsl"); + monjori.set("resolution", float(width), float(height)); + +} + +void draw() { + monjori.set("time", millis() / 1000.0); + + shader(monjori); + rect(0, 0, width, height); +} + diff --git a/java/examples/Topics/Shaders/Monjori/data/monjori.glsl b/java/examples/Topics/Shaders/Monjori/data/monjori.glsl new file mode 100644 index 000000000..8de1f8933 --- /dev/null +++ b/java/examples/Topics/Shaders/Monjori/data/monjori.glsl @@ -0,0 +1,29 @@ +uniform vec2 resolution; +uniform float time; + +void main(void) +{ + vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy; + float a = time*40.0; + float d,e,f,g=1.0/40.0,h,i,r,q; + e=400.0*(p.x*0.5+0.5); + f=400.0*(p.y*0.5+0.5); + i=200.0+sin(e*g+a/150.0)*20.0; + d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0; + r=sqrt(pow(i-e,2.0)+pow(d-f,2.0)); + q=f/r; + e=(r*cos(q))-a/2.0;f=(r*sin(q))-a/2.0; + d=sin(e*g)*176.0+sin(e*g)*164.0+r; + h=((f+d)+a/2.0)*g; + i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0); + h=sin(f*g)*144.0-sin(e*g)*212.0*p.x; + h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g; + i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h); + i=mod(i/5.6,256.0)/64.0; + if(i<0.0) i+=4.0; + if(i>=2.0) i=4.0-i; + d=r/350.0; + d+=sin(d*d*8.0)*0.52; + f=(sin(a*g)+1.0)/2.0; + gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),1.0); +} diff --git a/java/examples/Topics/Shaders/Nebula/Nebula.pde b/java/examples/Topics/Shaders/Nebula/Nebula.pde new file mode 100644 index 000000000..bbb93db25 --- /dev/null +++ b/java/examples/Topics/Shaders/Nebula/Nebula.pde @@ -0,0 +1,17 @@ +PShader nebula; + +void setup() { + size(320, 240, P3D); + noStroke(); + + nebula = loadShader("nebula.glsl"); + nebula.set("resolution", float(width), float(height)); +} + +void draw() { + nebula.set("time", millis() / 500.0); + shader(nebula); + fill(0); + rect(0, 0, width, height); +} + diff --git a/java/examples/Topics/Shaders/Nebula/data/nebula.glsl b/java/examples/Topics/Shaders/Nebula/data/nebula.glsl new file mode 100644 index 000000000..b9519c37e --- /dev/null +++ b/java/examples/Topics/Shaders/Nebula/data/nebula.glsl @@ -0,0 +1,110 @@ +uniform float time; +uniform vec2 resolution; + + +// NEBULA - CoffeeBreakStudios.com (CBS) +// Work in progress... +// +// 3148.26: Switched from classic to simplex noise +// 3148.27: Reduced number of stars +// 3249.0: Switched to fast computed 3D noise. Less quality but ~ 2x faster +// 3249.5: Removed use of random number generator to gain performance +// 3265.0: Added rotation: glsl.heroku.com/e#3005.1 + +//Utility functions + +vec3 fade(vec3 t) { + return vec3(1.0,1.0,1.0);//t*t*t*(t*(t*6.0-15.0)+10.0); +} + +vec2 rotate(vec2 point, float rads) { + float cs = cos(rads); + float sn = sin(rads); + return point * mat2(cs, -sn, sn, cs); +} + +vec4 randomizer4(const vec4 x) +{ + vec4 z = mod(x, vec4(5612.0)); + z = mod(z, vec4(3.1415927 * 2.0)); + return(fract(cos(z) * vec4(56812.5453))); +} + +// Fast computed noise +// http://www.gamedev.net/topic/502913-fast-computed-noise/ + +const float A = 1.0; +const float B = 57.0; +const float C = 113.0; +const vec3 ABC = vec3(A, B, C); +const vec4 A3 = vec4(0, B, C, C+B); +const vec4 A4 = vec4(A, A+B, C+A, C+A+B); + +float cnoise4(const in vec3 xx) +{ + vec3 x = mod(xx + 32768.0, 65536.0); + vec3 ix = floor(x); + vec3 fx = fract(x); + vec3 wx = fx*fx*(3.0-2.0*fx); + float nn = dot(ix, ABC); + + vec4 N1 = nn + A3; + vec4 N2 = nn + A4; + vec4 R1 = randomizer4(N1); + vec4 R2 = randomizer4(N2); + vec4 R = mix(R1, R2, wx.x); + float re = mix(mix(R.x, R.y, wx.y), mix(R.z, R.w, wx.y), wx.z); + + return 1.0 - 2.0 * re; +} +float surface3 ( vec3 coord, float frequency ) { + + float n = 0.0; + + n += 1.0 * abs( cnoise4( coord * frequency ) ); + n += 0.5 * abs( cnoise4( coord * frequency * 2.0 ) ); + n += 0.25 * abs( cnoise4( coord * frequency * 4.0 ) ); + n += 0.125 * abs( cnoise4( coord * frequency * 8.0 ) ); + n += 0.0625 * abs( cnoise4( coord * frequency * 16.0 ) ); + + return n; +} + +void main( void ) { + float rads = radians(time*3.15); + vec2 position = gl_FragCoord.xy / resolution.xy; + position += rotate(position, rads); + float n = surface3(vec3(position*sin(time*0.1), time * 0.05)*mat3(1,0,0,0,.8,.6,0,-.6,.8),0.9); + float n2 = surface3(vec3(position*cos(time*0.1), time * 0.04)*mat3(1,0,0,0,.8,.6,0,-.6,.8),0.8); + float lum = length(n); + float lum2 = length(n2); + + vec3 tc = pow(vec3(1.0-lum),vec3(sin(position.x)+cos(time)+4.0,8.0+sin(time)+4.0,8.0)); + vec3 tc2 = pow(vec3(1.1-lum2),vec3(5.0,position.y+cos(time)+7.0,sin(position.x)+sin(time)+2.0)); + vec3 curr_color = (tc*0.8) + (tc2*0.5); + + + //Let's draw some stars + + float scale = sin(0.3 * time) + 5.0; + vec2 position2 = (((gl_FragCoord.xy / resolution) - 0.5) * scale); + float gradient = 0.0; + vec3 color = vec3(0.0); + float fade = 0.0; + float z = 0.0; + vec2 centered_coord = position2 - vec2(sin(time*0.1),sin(time*0.1)); + centered_coord = rotate(centered_coord, rads); + + for (float i=1.0; i<=60.0; i++) + { + vec2 star_pos = vec2(sin(i) * 250.0, sin(i*i*i) * 250.0); + float z = mod(i*i - 10.0*time, 256.0); + float fade = (256.0 - z) /256.0; + vec2 blob_coord = star_pos / z; + gradient += ((fade / 384.0) / pow(length(centered_coord - blob_coord), 1.5)) * ( fade); + } + + curr_color += gradient; + + gl_FragColor = vec4(curr_color, 1.0); +} \ No newline at end of file