From 16128826a4e6909dcd4ef7812b066fea8f5f24f0 Mon Sep 17 00:00:00 2001 From: klemek Date: Tue, 16 Sep 2025 23:23:53 +0200 Subject: [PATCH] mix stage --- shaders/frag0.glsl | 26 +++++++++++++++++++++++++- shaders/frag5.glsl | 3 +-- src/shaders.c | 16 ++++++++-------- src/types.h | 3 +-- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/shaders/frag0.glsl b/shaders/frag0.glsl index 3aabb93..85d8bfd 100644 --- a/shaders/frag0.glsl +++ b/shaders/frag0.glsl @@ -919,4 +919,28 @@ subroutine(fx_stage_sub) vec3 fx_2(vec2 vUV, sampler2D previous, sampler2D feedb // 7. mix // ---------- -// TODO \ No newline at end of file +subroutine vec3 mix_stage_sub(vec2 vUV, sampler2D frame_a, sampler2D frame_b); + +subroutine uniform mix_stage_sub mix_stage; + +subroutine(mix_stage_sub) vec3 mix_0(vec2 vUV, sampler2D fa, sampler2D fb) +{ + float v = 0.5; + + vec3 color_a = texture(fa, vUV).xyz; + vec3 color_b = texture(fb, vUV).xyz; + + return mix(color_b, color_a, v); +} + +subroutine(mix_stage_sub) vec3 mix_1(vec2 vUV, sampler2D fa, sampler2D fb) +{ + float v = 0.5; + + vec3 color_a = texture(fa, vUV).xyz; + vec3 color_b = texture(fb, vUV).xyz; + + float k = mean(color_a); + + return mix(color_b, color_a, step(v, k)); +} \ No newline at end of file diff --git a/shaders/frag5.glsl b/shaders/frag5.glsl index 3576ce3..ee1da15 100644 --- a/shaders/frag5.glsl +++ b/shaders/frag5.glsl @@ -8,6 +8,5 @@ in vec2 vUV; layout(location = 7) out vec3 fragColor; void main() { - // TODO subroutine - fragColor = texture(frame5, vUV).xyz + texture(frame6, vUV).xyz; + fragColor = mix_stage(vUV, frame5, frame6); } \ No newline at end of file diff --git a/src/shaders.c b/src/shaders.c index 3467b6d..3d53509 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -151,19 +151,18 @@ void init_single_program(ShaderProgram *program, int i, bool output) { program->ires_locations[i] = glGetUniformLocation(program->programs[i], "iResolution"); - program->sub_src_locations[i] = glGetSubroutineUniformLocation( - program->programs[i], GL_FRAGMENT_SHADER, "src_stage"); - program->sub_fx_locations[i] = glGetSubroutineUniformLocation( - program->programs[i], GL_FRAGMENT_SHADER, "fx_stage"); - for (j = 0; j < SUB_COUNT; j++) { sprintf(name, "src_%d", j); program->sub_src_indexes[i][j] = glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name); - log_debug("%s %d", name, program->sub_src_indexes[i][j]); sprintf(name, "fx_%d", j); program->sub_fx_indexes[i][j] = glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name); + if (j < 2) { + sprintf(name, "mix_%d", j); + program->sub_mix_indexes[i][j] = glGetSubroutineIndex( + program->programs[i], GL_FRAGMENT_SHADER, name); + } } } @@ -233,7 +232,7 @@ void update_program(ShaderProgram program, File *fragment_shaders, int i) { void apply_program(ShaderProgram program, Context context) { int i, j; - GLuint subroutines[2]; + GLuint subroutines[3]; // viewport changed if (context.width != program.last_width || @@ -275,8 +274,9 @@ void apply_program(ShaderProgram program, Context context) { // TODO tmp subroutines[0] = program.sub_src_indexes[i][i == 0 ? 1 : 2]; subroutines[1] = program.sub_fx_indexes[i][i == 2 ? 1 : 0]; + subroutines[2] = program.sub_mix_indexes[i][1]; - glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 2, subroutines); + glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 3, subroutines); } // set GL_TEXTURE(X) to uniform sampler2D frameX diff --git a/src/types.h b/src/types.h index d0194f2..a8b21e6 100644 --- a/src/types.h +++ b/src/types.h @@ -47,10 +47,9 @@ typedef struct ShaderProgram { GLuint frames_locations[FRAG_COUNT + 1][TEX_COUNT]; - GLuint sub_src_locations[FRAG_COUNT]; GLuint sub_src_indexes[FRAG_COUNT][SUB_COUNT]; - GLuint sub_fx_locations[FRAG_COUNT]; GLuint sub_fx_indexes[FRAG_COUNT][SUB_COUNT]; + GLuint sub_mix_indexes[FRAG_COUNT][2]; GLuint vpos_locations[FRAG_COUNT + 1];