From a5a0cf977f3389d137633cd579e15b6c3141ef4a Mon Sep 17 00:00:00 2001 From: pedro Date: Tue, 26 Sep 2023 19:40:34 +0200 Subject: [PATCH] refactor snow filter --- .../gl/render/filters/SnowFilterRender.java | 32 +++------ encoder/src/main/res/drawable/snow_flakes.png | Bin 35362 -> 0 bytes encoder/src/main/res/raw/snow_fragment.glsl | 63 +++++++++--------- 3 files changed, 43 insertions(+), 52 deletions(-) delete mode 100644 encoder/src/main/res/drawable/snow_flakes.png diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java index 972604a7d..dc7187d70 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java @@ -57,12 +57,10 @@ public class SnowFilterRender extends BaseFilterRender { private int uSTMatrixHandle = -1; private int uSamplerHandle = -1; private int uTimeHandle = -1; - private int uSnowHandle = -1; + private int uResolutionHandle = -1; - private long START_TIME = System.currentTimeMillis(); - private TextureLoader textureLoader = new TextureLoader(); - private StreamObjectBase streamObjectBase; - private int[] snowTextureId = new int[] { -1 }; + private final long START_TIME = System.currentTimeMillis(); + private float speed = 1f; public SnowFilterRender() { squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) @@ -85,11 +83,7 @@ protected void initGlFilter(Context context) { uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); - uSnowHandle = GLES20.glGetUniformLocation(program, "uSnow"); - Bitmap snowBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.snow_flakes); - streamObjectBase = new ImageStreamObject(); - ((ImageStreamObject) streamObjectBase).load(snowBitmap); - snowTextureId = textureLoader.load(streamObjectBase.getBitmaps()); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); } @Override @@ -108,28 +102,24 @@ protected void drawFilter() { GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000f; - if (time >= 2) START_TIME += 2000; - GLES20.glUniform1f(uTimeHandle, time); + GLES20.glUniform1f(uTimeHandle, time * speed); GLES20.glUniform1i(uSamplerHandle, 4); GLES20.glActiveTexture(GLES20.GL_TEXTURE4); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); - - GLES20.glUniform1i(uSnowHandle, 5); - GLES20.glActiveTexture(GLES20.GL_TEXTURE5); - GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, snowTextureId[0]); } @Override public void release() { GLES20.glDeleteProgram(program); - releaseTextureId(); - if (streamObjectBase != null) streamObjectBase.recycle(); } - private void releaseTextureId() { - if (snowTextureId != null) GLES20.glDeleteTextures(1, snowTextureId, 0); - snowTextureId = new int[] { -1 }; + /** + * @param value fall speed, default 1.0f + */ + public void setSpeed(float value) { + this.speed = value; } } \ No newline at end of file diff --git a/encoder/src/main/res/drawable/snow_flakes.png b/encoder/src/main/res/drawable/snow_flakes.png deleted file mode 100644 index 16593caf93ee1a58c723d31008ba65c13bdc9db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35362 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 1.0 || pos.y < 0.0 || pos.y > 1.0) { - texel = vec3(0.0, 0.0, 0.0); - } else { - texel = texture2D(uSnow, pos).rgb; +#define pi 3.1415926 + +vec2 hash(vec2 p) { + p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3))); + return fract(sin(p) * 18.5453); +} + +float simplegridnoise(vec2 v) { + float s = 1.0 / 256.; + vec2 fl = floor(v), fr = fract(v); + float mindist = 1e9; + for(int y = -1; y <= 1; y++) { + for(int x = -1; x <= 1; x++) { + vec2 offset = vec2(x, y); + vec2 pos = 0.5 + 0.5 * cos(2.0 * pi * (uTime * 0.1 + hash(fl+offset)) + vec2(0, 1.6)); + mindist = min(mindist, length(pos+offset -fr)); + } } - // Only use extremely bright values. - texel = smoothstep(0.6, 1.0, texel); - // Okay how can this give a transparent rgba value? - return vec4(texel, 1.0); + return mindist; } -/* - Provides a 2D vector with which to warp the sampling location - of the snow_flakes texture. -*/ -vec2 warpSpeed(float time, float gravity, vec2 pos) { - // Do some things to stretch out the timescale based on 2D position and actual time. - return vec2(-time * 5.55 + sin(pos.x * 10.0 * sin(time * 0.2)) * 0.4, - time * gravity + sin(pos.y * 10.0 * sin(time * 0.4)) * 0.4); +float blobnoise(vec2 v, float s) { + return pow(0.5 + 0.5 * cos(pi * clamp(simplegridnoise(v) * 2.0, 0.0, 1.0)), s); } -vec4 getSnowField(vec2 pos) { - // Just some not-so-magic inversely related values. - // That's all they are. - return getSnow(pos - 0.75 + uTime * 0.25) + - getSnow(pos - 0.5 + uTime * 0.25) + - getSnow(pos - 0.25 + uTime * 0.25) + - getSnow(pos - 0.0 + uTime * 0.25); +float fractalblobnoise(vec2 v, float s) { + float val = 0.0; + const float n = 4.0; + for(float i = 0.0; i < n; i++) { + val += pow(0.5, i + 1.0) * blobnoise(exp2(i) * v + vec2(0, uTime), s); + } + return val; } void main() { - gl_FragColor = max(texture2D(uSampler, vTextureCoord), getSnowField(vTextureCoord)); + vec2 r = vec2(1.0, uResolution.y / uResolution.x); + vec2 uv = vTextureCoord.xy / uResolution.xy; + float val = fractalblobnoise(r * vTextureCoord * 20.0, 5.0); //more snowflakes r * uv * 40.0, 1.25 + gl_FragColor = mix(texture2D(uSampler, vTextureCoord), vec4(1.0), vec4(val)); } \ No newline at end of file