Skip to content

Commit

Permalink
[orx-fx] Make FilmGrain and HashBlur filters work on web (#226)
Browse files Browse the repository at this point in the history
  • Loading branch information
goudreinette authored Feb 28, 2022
1 parent b7bd7ae commit d180d71
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 10 deletions.
2 changes: 2 additions & 0 deletions orx-fx/src/commonMain/kotlin/grain/FilmGrain.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package org.openrndr.extra.fx.grain

import org.openrndr.draw.Filter
import org.openrndr.extra.fx.fx_film_grain
import org.openrndr.extra.fx.mppFilterShader
Expand Down
40 changes: 31 additions & 9 deletions orx-fx/src/shaders/glsl/blur/hash-blur.frag
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
// based on Hashed blur by David Hoskins.
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

uniform float radius;
#ifdef OR_IN_OUT
in vec2 v_texCoord0;
#else
varying vec2 v_texCoord0;
#endif

uniform sampler2D tex0;
uniform vec2 textureSize0;
uniform float radius;
uniform float time;
uniform int samples;
uniform float gain;

#ifndef OR_GL_FRAGCOLOR
out vec4 o_color;
#endif

#define TAU 6.28318530718

//-------------------------------------------------------------------------------------------
#define HASHSCALE 443.8975
vec2 hash22(vec2 p) {
vec3 p3 = fract(vec3(p.xyx) * HASHSCALE);
p3 += dot(p3, p3.yzx+19.19);
return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));
p3 += dot(p3, p3.yzx+19.19);
return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));
}

vec2 sampleTexture(inout vec2 r) {
Expand All @@ -28,20 +37,33 @@ vec2 sampleTexture(inout vec2 r) {

//-------------------------------------------------------------------------------------------
vec4 blur(vec2 uv, float radius) {
vec2 circle = vec2(radius) * (vec2(1.0) / textureSize(tex0, 0));
vec2 circle = vec2(radius) * (vec2(1.0) / textureSize0);
vec2 random = hash22(uv + vec2(time));

vec4 acc = vec4(0.0);
for (int i = 0; i < samples; i++) {

for (int i = 0; i < 100; i++) {
if (i > samples) break;
#ifndef OR_GL_TEXTURE2D
acc += texture(tex0, uv + circle * sampleTexture(random));
}
#else
acc += texture2D(tex0, uv + circle * sampleTexture(random));
#endif
}
return acc / float(samples);
}

//-------------------------------------------------------------------------------------------
void main() {
vec2 uv = v_texCoord0;
float radiusSqr = pow(radius, 2.0);
o_color = blur(uv, radiusSqr);
o_color.rgb *= gain;
float radiusSqr = pow(radius, 2.0);

vec4 result = blur(uv, radiusSqr);
result.rgb *= gain;

#ifdef OR_GL_FRAGCOLOR
gl_FragColor = result;
#else
o_color = result;
#endif
}
2 changes: 1 addition & 1 deletion orx-fx/src/shaders/glsl/grain/film-grain.frag
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ void main() {

// After this you would normally perform tone mapping,
// apply the grain before that.
#ifndef OR_GL_FRACOLOR
#ifndef OR_GL_FRAGCOLOR
o_output.rgb = color;
o_output.a = 1.0;
#else
Expand Down

0 comments on commit d180d71

Please sign in to comment.