ashton 0.0.1alpha → 0.0.2alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +21 -21
- data/README.md +95 -68
- data/Rakefile +41 -23
- data/examples/bloom_example.rb +59 -0
- data/examples/lighting_example.rb +127 -0
- data/examples/media/SmallStar.png +0 -0
- data/examples/media/Starfighter.png +0 -0
- data/examples/media/simple.png +0 -0
- data/examples/noise_example.rb +94 -0
- data/examples/outline_example.rb +86 -0
- data/examples/particle_emitter_example.rb +114 -0
- data/examples/pixelate_example.rb +51 -49
- data/examples/pixelated_texture_example.rb +69 -0
- data/examples/radial_blur_example.rb +60 -62
- data/examples/shader_image_example.rb +74 -41
- data/examples/{shockwave2_example.rb → shockwave_example.rb} +74 -75
- data/examples/stencil_shader_example.rb +104 -0
- data/examples/{framebuffer_example.rb → texture_render_example.rb} +53 -49
- data/examples/{tv_screen_and_noise_example.rb → tv_screen_and_static_example.rb} +59 -59
- data/ext/ashton/GLee.c +18170 -0
- data/ext/ashton/GLee.h +17647 -0
- data/ext/ashton/ashton.c +42 -0
- data/ext/ashton/ashton.h +31 -0
- data/ext/ashton/color.c +45 -0
- data/ext/ashton/color.h +25 -0
- data/ext/ashton/common.h +41 -0
- data/ext/ashton/extconf.rb +42 -0
- data/ext/ashton/fast_math.c +30 -0
- data/ext/ashton/fast_math.h +30 -0
- data/ext/ashton/font.c +8 -0
- data/ext/ashton/font.h +16 -0
- data/ext/ashton/gosu.c +18 -0
- data/ext/ashton/gosu.h +19 -0
- data/ext/ashton/image.c +8 -0
- data/ext/ashton/image.h +16 -0
- data/ext/ashton/particle_emitter.c +788 -0
- data/ext/ashton/particle_emitter.h +171 -0
- data/ext/ashton/pixel_cache.c +237 -0
- data/ext/ashton/pixel_cache.h +58 -0
- data/ext/ashton/shader.c +9 -0
- data/ext/ashton/shader.h +16 -0
- data/ext/ashton/texture.c +442 -0
- data/ext/ashton/texture.h +63 -0
- data/ext/ashton/window.c +8 -0
- data/ext/ashton/window.h +16 -0
- data/lib/ashton.rb +38 -26
- data/lib/ashton/1.9/ashton.so +0 -0
- data/lib/ashton/gosu_ext/color.rb +24 -11
- data/lib/ashton/gosu_ext/font.rb +58 -0
- data/lib/ashton/gosu_ext/gosu_module.rb +16 -0
- data/lib/ashton/gosu_ext/image.rb +95 -31
- data/lib/ashton/gosu_ext/window.rb +78 -35
- data/lib/ashton/image_stub.rb +32 -36
- data/lib/ashton/lighting/light_source.rb +146 -0
- data/lib/ashton/lighting/manager.rb +98 -0
- data/lib/ashton/mixins/version_checking.rb +23 -0
- data/lib/ashton/particle_emitter.rb +87 -0
- data/lib/ashton/pixel_cache.rb +24 -0
- data/lib/ashton/shader.rb +353 -35
- data/lib/ashton/shaders/bloom.frag +41 -0
- data/lib/ashton/shaders/color_inversion.frag +11 -0
- data/lib/ashton/{post_process → shaders}/contrast.frag +16 -16
- data/lib/ashton/{shader → shaders}/default.frag +22 -19
- data/lib/ashton/{shader → shaders}/default.vert +13 -13
- data/lib/ashton/shaders/fade.frag +14 -0
- data/lib/ashton/shaders/grayscale.frag +15 -0
- data/lib/ashton/shaders/include/classicnoise2d.glsl +113 -0
- data/lib/ashton/shaders/include/classicnoise3d.glsl +177 -0
- data/lib/ashton/shaders/include/classicnoise4d.glsl +302 -0
- data/lib/ashton/{include/simplex.glsl → shaders/include/noise2d.glsl} +70 -63
- data/lib/ashton/shaders/include/noise3d.glsl +102 -0
- data/lib/ashton/shaders/include/noise4d.glsl +128 -0
- data/lib/ashton/shaders/include/rand.glsl +5 -0
- data/lib/ashton/shaders/lighting/distort.frag +57 -0
- data/lib/ashton/shaders/lighting/draw_shadows.frag +60 -0
- data/lib/ashton/shaders/lighting/shadow_blur.frag +60 -0
- data/lib/ashton/shaders/mezzotint.frag +22 -0
- data/lib/ashton/shaders/multitexture2.vert +19 -0
- data/lib/ashton/shaders/outline.frag +45 -0
- data/lib/ashton/{post_process → shaders}/pixelate.frag +48 -48
- data/lib/ashton/shaders/radial_blur.frag +63 -0
- data/lib/ashton/shaders/sepia.frag +26 -0
- data/lib/ashton/{post_process/shockwave2.frag → shaders/shockwave.frag} +38 -35
- data/lib/ashton/shaders/signed_distance_field.frag +80 -0
- data/lib/ashton/{post_process/noise.frag → shaders/static.frag} +25 -27
- data/lib/ashton/shaders/stencil.frag +27 -0
- data/lib/ashton/shaders/tv_screen.frag +23 -0
- data/lib/ashton/signed_distance_field.rb +151 -0
- data/lib/ashton/texture.rb +186 -0
- data/lib/ashton/version.rb +2 -2
- data/lib/ashton/window_buffer.rb +16 -0
- data/spec/ashton/ashton_spec.rb +22 -0
- data/spec/ashton/gosu_ext/color_spec.rb +34 -0
- data/spec/ashton/gosu_ext/font_spec.rb +57 -0
- data/spec/ashton/gosu_ext/gosu_spec.rb +11 -0
- data/spec/ashton/gosu_ext/image_spec.rb +66 -0
- data/spec/ashton/gosu_ext/window_spec.rb +71 -0
- data/spec/ashton/image_stub_spec.rb +46 -0
- data/spec/ashton/particle_emitter_spec.rb +123 -0
- data/spec/ashton/pixel_cache_spec.rb +153 -0
- data/spec/ashton/shader_spec.rb +152 -0
- data/spec/ashton/signed_distance_field_spec.rb +163 -0
- data/spec/ashton/texture_spec.rb +347 -0
- data/spec/helper.rb +12 -0
- metadata +159 -28
- data/examples/output/README.txt +0 -1
- data/lib/ashton/base_shader.rb +0 -172
- data/lib/ashton/framebuffer.rb +0 -183
- data/lib/ashton/post_process.rb +0 -83
- data/lib/ashton/post_process/default.vert +0 -9
- data/lib/ashton/post_process/fade.frag +0 -11
- data/lib/ashton/post_process/mezzotint.frag +0 -24
- data/lib/ashton/post_process/radial_blur.frag +0 -31
- data/lib/ashton/post_process/sepia.frag +0 -19
- data/lib/ashton/post_process/shockwave.frag +0 -40
- data/lib/ashton/post_process/tv_screen.frag +0 -32
@@ -0,0 +1,60 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
// Based on Catalin Zima's shader based dynamic shadows system.
|
4
|
+
// http://www.catalinzima.com/2010/07/my-technique-for-the-shader-based-dynamic-2d-shadows/
|
5
|
+
|
6
|
+
|
7
|
+
const float minBlur = 0.0;
|
8
|
+
const float maxBlur = 5.0; // TODO: Make this a uniform?
|
9
|
+
const int blurSamples = 13;
|
10
|
+
|
11
|
+
uniform sampler2D in_Texture; // Original texture.
|
12
|
+
uniform int in_TextureWidth;
|
13
|
+
|
14
|
+
varying vec2 var_TexCoord; // Pixel to process on this pass.
|
15
|
+
|
16
|
+
void main()
|
17
|
+
{
|
18
|
+
vec2 offsetAndWeight[blurSamples];
|
19
|
+
|
20
|
+
offsetAndWeight[0] = vec2( 0.0, 0.199471);
|
21
|
+
offsetAndWeight[1] = vec2( 1.0, 0.176033);
|
22
|
+
offsetAndWeight[2] = vec2( 2.0, 0.120985);
|
23
|
+
offsetAndWeight[3] = vec2( 3.0, 0.064759);
|
24
|
+
offsetAndWeight[4] = vec2( 4.0, 0.026995);
|
25
|
+
offsetAndWeight[5] = vec2( 5.0, 0.008764);
|
26
|
+
offsetAndWeight[6] = vec2( 6.0, 0.002216);
|
27
|
+
|
28
|
+
vec4 color = texture2D(in_Texture, var_TexCoord);
|
29
|
+
float distance = color.b;
|
30
|
+
float pixel_width = 1.0 / float(in_TextureWidth);
|
31
|
+
|
32
|
+
// Take a reading from the center pixel once,
|
33
|
+
// but multiply since it would be added twice in the loop.
|
34
|
+
float sum = color.r * offsetAndWeight[0].y * 2.0;
|
35
|
+
|
36
|
+
for (int i = 1; i < blurSamples; i++)
|
37
|
+
{
|
38
|
+
float offset = offsetAndWeight[i].x;
|
39
|
+
float weight = offsetAndWeight[i].y;
|
40
|
+
|
41
|
+
offset *= pixel_width * mix(minBlur, maxBlur, distance);
|
42
|
+
|
43
|
+
// Take colour from above, below, left and right at once.
|
44
|
+
float effect = texture2D(in_Texture, var_TexCoord + vec2( offset, 0.0)).r +
|
45
|
+
texture2D(in_Texture, var_TexCoord + vec2(-offset, 0.0)).r +
|
46
|
+
texture2D(in_Texture, var_TexCoord + vec2( 0.0, offset)).r +
|
47
|
+
texture2D(in_Texture, var_TexCoord + vec2( 0.0, -offset)).r;
|
48
|
+
|
49
|
+
sum += effect * weight;
|
50
|
+
}
|
51
|
+
|
52
|
+
// Halve the sum, since we have applied horizontal and vertical at once.
|
53
|
+
sum *= 0.5;
|
54
|
+
|
55
|
+
// Light is brighter at the center.
|
56
|
+
float d = 2.0 * length(var_TexCoord - 0.5);
|
57
|
+
float attenuation = clamp(1.0 - d, 0.0, 1.0);
|
58
|
+
|
59
|
+
gl_FragColor = vec4(vec3(sum * attenuation), 1.0);
|
60
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
#include <rand>
|
4
|
+
|
5
|
+
uniform sampler2D in_Texture;
|
6
|
+
uniform int in_WindowWidth;
|
7
|
+
|
8
|
+
uniform int in_T;
|
9
|
+
|
10
|
+
varying vec2 var_TexCoord;
|
11
|
+
|
12
|
+
void main() {
|
13
|
+
vec4 color = texture2D(in_Texture, var_TexCoord);
|
14
|
+
vec3 mezzo = vec3(0.0);
|
15
|
+
float width = float(in_WindowWidth);
|
16
|
+
|
17
|
+
if(rand(var_TexCoord + float(in_T) / width) <= color.r) { mezzo.r = 1.0; }
|
18
|
+
if(rand(var_TexCoord + float(in_T) / width) <= color.g) { mezzo.g = 1.0; }
|
19
|
+
if(rand(var_TexCoord + float(in_T) / width) <= color.b) { mezzo.b = 1.0; }
|
20
|
+
|
21
|
+
gl_FragColor.rgb = mezzo;
|
22
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
attribute vec4 in_Color;
|
4
|
+
|
5
|
+
varying vec4 var_Color;
|
6
|
+
varying vec2 var_TexCoord0;
|
7
|
+
varying vec2 var_TexCoord1;
|
8
|
+
|
9
|
+
void main()
|
10
|
+
{
|
11
|
+
gl_Position = ftransform();
|
12
|
+
var_Color = in_Color;
|
13
|
+
|
14
|
+
// Set the coordinates for TEXTURE0
|
15
|
+
var_TexCoord0 = gl_MultiTexCoord0.xy;
|
16
|
+
|
17
|
+
// Set the coordinates for TEXTURE1
|
18
|
+
var_TexCoord1 = gl_MultiTexCoord1.xy;
|
19
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
const float ALPHA_THRESHOLD = 0.5;
|
4
|
+
|
5
|
+
const vec2 TextureSize = vec2(1024.0, 1024.0); // Gosu-specific!
|
6
|
+
const vec2 PixelSize = 1.0 / TextureSize;
|
7
|
+
|
8
|
+
// Automatically set by Ray (actually passed from the vertex shader).
|
9
|
+
uniform sampler2D in_Texture; // Original texture.
|
10
|
+
//uniform int in_WindowWidth;
|
11
|
+
//uniform int in_WindowHeight;
|
12
|
+
|
13
|
+
uniform vec4 in_OutlineColor;
|
14
|
+
uniform float in_OutlineWidth; // In pixels.
|
15
|
+
|
16
|
+
varying vec2 var_TexCoord; // Pixel to process on this pass
|
17
|
+
varying vec4 var_Color;
|
18
|
+
|
19
|
+
void main()
|
20
|
+
{
|
21
|
+
gl_FragColor = texture2D(in_Texture, var_TexCoord); // * var_Color;
|
22
|
+
|
23
|
+
if(gl_FragColor.a < ALPHA_THRESHOLD)
|
24
|
+
{
|
25
|
+
for(int i = -1; i < 2; i++)
|
26
|
+
{
|
27
|
+
for(int j = -1; j < 2; j++)
|
28
|
+
{
|
29
|
+
if(i != 0 && j != 0)
|
30
|
+
{
|
31
|
+
// Get the color of the adjacent pixel.
|
32
|
+
vec2 pos = var_TexCoord + vec2(i, j) * PixelSize * in_OutlineWidth;
|
33
|
+
if(texture2D(in_Texture, pos).a > ALPHA_THRESHOLD)
|
34
|
+
{
|
35
|
+
gl_FragColor = in_OutlineColor;
|
36
|
+
|
37
|
+
// Simplified return, since GLSL 1.10 hates `return`.
|
38
|
+
i = 2;
|
39
|
+
j = 2;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
@@ -1,48 +1,48 @@
|
|
1
|
-
#version 110
|
2
|
-
|
3
|
-
#define KERNEL_SIZE 9
|
4
|
-
|
5
|
-
uniform int in_WindowWidth;
|
6
|
-
uniform int in_WindowHeight;
|
7
|
-
|
8
|
-
uniform sampler2D in_Texture;
|
9
|
-
uniform int in_PixelSize;
|
10
|
-
|
11
|
-
varying vec2 var_TexCoord;
|
12
|
-
|
13
|
-
vec2 texCoords[KERNEL_SIZE];
|
14
|
-
|
15
|
-
void main(void)
|
16
|
-
{
|
17
|
-
vec4 avgColor;
|
18
|
-
vec2 texCoordsStep = 1.0 /
|
19
|
-
(vec2(float(in_WindowWidth), float(in_WindowHeight))/float(in_PixelSize));
|
20
|
-
vec2 pixelBin = floor(var_TexCoord / texCoordsStep);
|
21
|
-
vec2 inPixelStep = texCoordsStep / 3.0;
|
22
|
-
vec2 inPixelHalfStep = inPixelStep / 2.0;
|
23
|
-
|
24
|
-
|
25
|
-
texCoords[0] = vec2(inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
26
|
-
texCoords[1] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
27
|
-
texCoords[2] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
28
|
-
texCoords[3] = vec2(inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
29
|
-
texCoords[4] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
30
|
-
texCoords[5] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
31
|
-
texCoords[6] = vec2(inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
32
|
-
texCoords[7] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
33
|
-
texCoords[8] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
34
|
-
|
35
|
-
avgColor = texture2D(in_Texture, texCoords[0]) +
|
36
|
-
texture2D(in_Texture, texCoords[1]) +
|
37
|
-
texture2D(in_Texture, texCoords[2]) +
|
38
|
-
texture2D(in_Texture, texCoords[3]) +
|
39
|
-
texture2D(in_Texture, texCoords[4]) +
|
40
|
-
texture2D(in_Texture, texCoords[5]) +
|
41
|
-
texture2D(in_Texture, texCoords[6]) +
|
42
|
-
texture2D(in_Texture, texCoords[7]) +
|
43
|
-
texture2D(in_Texture, texCoords[8]);
|
44
|
-
|
45
|
-
avgColor /= float(KERNEL_SIZE);
|
46
|
-
|
47
|
-
gl_FragColor = avgColor;
|
48
|
-
}
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
#define KERNEL_SIZE 9
|
4
|
+
|
5
|
+
uniform int in_WindowWidth;
|
6
|
+
uniform int in_WindowHeight;
|
7
|
+
|
8
|
+
uniform sampler2D in_Texture;
|
9
|
+
uniform int in_PixelSize;
|
10
|
+
|
11
|
+
varying vec2 var_TexCoord;
|
12
|
+
|
13
|
+
vec2 texCoords[KERNEL_SIZE];
|
14
|
+
|
15
|
+
void main(void)
|
16
|
+
{
|
17
|
+
vec4 avgColor;
|
18
|
+
vec2 texCoordsStep = 1.0 /
|
19
|
+
(vec2(float(in_WindowWidth), float(in_WindowHeight))/float(in_PixelSize));
|
20
|
+
vec2 pixelBin = floor(var_TexCoord / texCoordsStep);
|
21
|
+
vec2 inPixelStep = texCoordsStep / 3.0;
|
22
|
+
vec2 inPixelHalfStep = inPixelStep / 2.0;
|
23
|
+
|
24
|
+
|
25
|
+
texCoords[0] = vec2(inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
26
|
+
texCoords[1] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
27
|
+
texCoords[2] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
28
|
+
texCoords[3] = vec2(inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
29
|
+
texCoords[4] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
30
|
+
texCoords[5] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
31
|
+
texCoords[6] = vec2(inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
32
|
+
texCoords[7] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
33
|
+
texCoords[8] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
|
34
|
+
|
35
|
+
avgColor = texture2D(in_Texture, texCoords[0]) +
|
36
|
+
texture2D(in_Texture, texCoords[1]) +
|
37
|
+
texture2D(in_Texture, texCoords[2]) +
|
38
|
+
texture2D(in_Texture, texCoords[3]) +
|
39
|
+
texture2D(in_Texture, texCoords[4]) +
|
40
|
+
texture2D(in_Texture, texCoords[5]) +
|
41
|
+
texture2D(in_Texture, texCoords[6]) +
|
42
|
+
texture2D(in_Texture, texCoords[7]) +
|
43
|
+
texture2D(in_Texture, texCoords[8]);
|
44
|
+
|
45
|
+
avgColor /= float(KERNEL_SIZE);
|
46
|
+
|
47
|
+
gl_FragColor = avgColor;
|
48
|
+
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
// http://www.gamerendering.com/2008/12/20/radial-blur-filter/
|
4
|
+
|
5
|
+
uniform sampler2D in_Texture; // Texture to manipulate.
|
6
|
+
uniform int in_WindowWidth;
|
7
|
+
uniform int in_WindowHeight;
|
8
|
+
|
9
|
+
uniform float in_Spacing; // good value is 1.0;
|
10
|
+
uniform float in_Strength; // good value is 2.2;
|
11
|
+
|
12
|
+
varying vec2 var_TexCoord;
|
13
|
+
|
14
|
+
void main(void)
|
15
|
+
{
|
16
|
+
// some sample positions. GLSL 1.10 is painfully dumb with arrays :)
|
17
|
+
float samples[10];
|
18
|
+
samples[0] = -0.08;
|
19
|
+
samples[1] = -0.05;
|
20
|
+
samples[2] = -0.03;
|
21
|
+
samples[3] = -0.02;
|
22
|
+
samples[4] = -0.01;
|
23
|
+
samples[5] = 0.01;
|
24
|
+
samples[6] = 0.02;
|
25
|
+
samples[7] = 0.03;
|
26
|
+
samples[8] = 0.05;
|
27
|
+
samples[9] = 0.08;
|
28
|
+
|
29
|
+
// 0.5,0.5 is the center of the screen
|
30
|
+
// so substracting uv from it will result in
|
31
|
+
// a vector pointing to the middle of the screen
|
32
|
+
vec2 dir = 0.5 - var_TexCoord;
|
33
|
+
|
34
|
+
// calculate the distance to the center of the screen
|
35
|
+
float dist = sqrt(dir.x * dir.x + dir.y * dir.y);
|
36
|
+
|
37
|
+
// normalize the direction (reuse the distance)
|
38
|
+
dir /= dist;
|
39
|
+
|
40
|
+
// this is the original colour of this fragment
|
41
|
+
// using only this would result in a non-blurred version
|
42
|
+
vec4 color = texture2D(in_Texture, var_TexCoord);
|
43
|
+
|
44
|
+
vec4 sum = color;
|
45
|
+
|
46
|
+
// take 10 additional blur samples in the direction towards
|
47
|
+
// the center of the screen
|
48
|
+
for (int i = 0; i < 10; i++)
|
49
|
+
{
|
50
|
+
sum += texture2D(in_Texture, var_TexCoord + dir * samples[i] * in_Spacing);
|
51
|
+
}
|
52
|
+
|
53
|
+
// we have taken eleven samples
|
54
|
+
sum *= 1.0/11.0;
|
55
|
+
|
56
|
+
// weighten the blur effect with the distance to the
|
57
|
+
// center of the screen ( further out is blurred more)
|
58
|
+
float t = dist * in_Strength;
|
59
|
+
t = clamp(t, 0.0, 1.0); //0 <= t <= 1
|
60
|
+
|
61
|
+
// Blend the original color with the averaged pixels
|
62
|
+
gl_FragColor = mix(color, sum, t);
|
63
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
uniform sampler2D in_Texture;
|
4
|
+
|
5
|
+
varying vec2 var_TexCoord;
|
6
|
+
|
7
|
+
void main()
|
8
|
+
{
|
9
|
+
vec4 Sepia1 = vec4( 0.2, 0.05, 0.0, 1.0 );
|
10
|
+
vec4 Sepia2 = vec4( 1.0, 0.9, 0.5, 1.0 );
|
11
|
+
|
12
|
+
vec4 Color = texture2D(in_Texture, vec2(var_TexCoord));
|
13
|
+
|
14
|
+
if(Color.a == 0.0)
|
15
|
+
{
|
16
|
+
gl_FragColor = Color;
|
17
|
+
}
|
18
|
+
else
|
19
|
+
{
|
20
|
+
float SepiaMix = dot(vec3(0.3, 0.59, 0.11), vec3(Color));
|
21
|
+
Color = mix(Color, vec4(SepiaMix), vec4(0.5));
|
22
|
+
vec4 Sepia = mix(Sepia1, Sepia2, SepiaMix);
|
23
|
+
|
24
|
+
gl_FragColor = mix(Color, Sepia, 1.0);
|
25
|
+
}
|
26
|
+
}
|
@@ -1,35 +1,38 @@
|
|
1
|
-
#version 110
|
2
|
-
|
3
|
-
// http://
|
4
|
-
|
5
|
-
|
6
|
-
uniform
|
7
|
-
uniform
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
uniform int
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
vec2
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
float
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
}
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
// http://empire-defense.crystalin.fr/blog/2d_shock_wave_texture_with_shader
|
4
|
+
// http://www.geeks3d.com/20091116/shader-library-2d-shockwave-post-processing-filter-glsl/
|
5
|
+
|
6
|
+
uniform sampler2D in_Texture; // 0
|
7
|
+
uniform vec2 in_Center; // Mouse position
|
8
|
+
uniform float in_Time; // effect elapsed time. Multiply this to affect speed.
|
9
|
+
|
10
|
+
// Amplitude?, Refraction?, Width? e.g. 10.0, 0.8, 0.1
|
11
|
+
uniform vec3 in_ShockParams;
|
12
|
+
|
13
|
+
uniform int in_WindowWidth;
|
14
|
+
uniform int in_WindowHeight;
|
15
|
+
|
16
|
+
varying vec2 var_TexCoord;
|
17
|
+
|
18
|
+
void main()
|
19
|
+
{
|
20
|
+
vec2 uv = var_TexCoord;
|
21
|
+
vec2 texCoord = uv;
|
22
|
+
float x = in_Center.x / float(in_WindowWidth);
|
23
|
+
float y = (float(in_WindowHeight) - in_Center.y) / float(in_WindowHeight);
|
24
|
+
float distance = distance(uv, vec2(x, y));
|
25
|
+
|
26
|
+
if ( (distance <= (in_Time + in_ShockParams.z)) &&
|
27
|
+
(distance >= (in_Time - in_ShockParams.z)) )
|
28
|
+
{
|
29
|
+
float diff = (distance - in_Time);
|
30
|
+
float powDiff = 1.0 - pow(abs(diff * in_ShockParams.x),
|
31
|
+
in_ShockParams.y);
|
32
|
+
float diffTime = diff * powDiff;
|
33
|
+
vec2 diffUV = normalize(uv - in_Center);
|
34
|
+
texCoord = uv + (diffUV * diffTime);
|
35
|
+
}
|
36
|
+
|
37
|
+
gl_FragColor = texture2D(in_Texture, texCoord);
|
38
|
+
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
// Calculates a signed distance field, based on how far any pixel is from an opaque pixel.
|
4
|
+
// In each pixel, the signed value is actually r/g/b - 128
|
5
|
+
// if r/g/b > 0 => distance from an opaque pixel.
|
6
|
+
// if r/g/b <= 0 => distance from an opaque pixel that is adjacent to a transparent pixel.
|
7
|
+
|
8
|
+
uniform sampler2D in_Texture; // Original texture.
|
9
|
+
|
10
|
+
uniform vec2 in_TextureSize; // Width and height of the texture, so we know how big pixels are.
|
11
|
+
uniform int in_StepSize; // Distance to check each time (larger steps will be faster, but less accurate).
|
12
|
+
uniform int in_MaxDistance; // Maximum distance to search out to. Cannot be more than 127!
|
13
|
+
|
14
|
+
varying vec2 var_TexCoord; // Pixel to process on this pass.
|
15
|
+
|
16
|
+
const float NUM_SPOKES = 36.0; // Number of radiating lines to check in.
|
17
|
+
const float ANGULAR_STEP = 360.0 / NUM_SPOKES;
|
18
|
+
|
19
|
+
const int ZERO_VALUE = 128; // Color channel containing 0 => -128, 128 => 0, 255 => +127
|
20
|
+
|
21
|
+
// Returns true an alpha value is found at this distance (any direction).
|
22
|
+
bool find_alpha_at_distance(in vec2 center, in vec2 distance, in float alpha)
|
23
|
+
{
|
24
|
+
bool found = false;
|
25
|
+
|
26
|
+
for(float angle = 0.0; angle < 360.0; angle += ANGULAR_STEP)
|
27
|
+
{
|
28
|
+
vec2 position = center + distance * vec2(cos(angle), sin(angle));
|
29
|
+
|
30
|
+
if(texture2D(in_Texture, position).a == alpha)
|
31
|
+
{
|
32
|
+
found = true;
|
33
|
+
angle = 361.0;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
return found;
|
38
|
+
}
|
39
|
+
|
40
|
+
void main()
|
41
|
+
{
|
42
|
+
vec2 pixel_size = 1.0 / in_TextureSize;
|
43
|
+
|
44
|
+
int distance;
|
45
|
+
|
46
|
+
if(texture2D(in_Texture, var_TexCoord).a == 0.0)
|
47
|
+
{
|
48
|
+
// Texel is transparent, search for nearest opaque.
|
49
|
+
distance = ZERO_VALUE + 1;
|
50
|
+
for(int i = in_StepSize; i < in_MaxDistance; i += in_StepSize)
|
51
|
+
{
|
52
|
+
if(find_alpha_at_distance(var_TexCoord, float(i) * pixel_size, 1.0))
|
53
|
+
{
|
54
|
+
i = in_MaxDistance + 1; // BREAK!
|
55
|
+
}
|
56
|
+
else
|
57
|
+
{
|
58
|
+
distance = ZERO_VALUE + 1 + i;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
else
|
63
|
+
{
|
64
|
+
// Texel is opaque, search for nearest transparent.
|
65
|
+
distance = ZERO_VALUE;
|
66
|
+
for(int i = in_StepSize; i <= in_MaxDistance; i += in_StepSize)
|
67
|
+
{
|
68
|
+
if(find_alpha_at_distance(var_TexCoord, float(i) * pixel_size, 0.0))
|
69
|
+
{
|
70
|
+
i = in_MaxDistance + 1; // BREAK!
|
71
|
+
}
|
72
|
+
else
|
73
|
+
{
|
74
|
+
distance = ZERO_VALUE - i;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
gl_FragColor = vec4(vec3(float(distance) / 255.0), 1.0);
|
80
|
+
}
|