From c05a193b4dc9ca8a38267d26864c27b888c49e4d Mon Sep 17 00:00:00 2001 From: klemek Date: Thu, 18 Sep 2025 20:43:56 +0200 Subject: [PATCH] wip shader config --- README.md | 3 +++ shaders/frag0.glsl | 38 +++++++++++++++++++------------------- shaders/shaders.cfg | 17 +++++++++++++++-- src/forge.c | 8 +++++++- src/shaders.c | 9 +++++---- src/shaders.h | 3 ++- 6 files changed, 51 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index fbf1ae6..665385f 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,9 @@ make -f Makefile.dev release-arch - [ ] 16 input + 16 fx definition and selection (with const param) - [x] Feedback texture - [ ] Shaders config file + - [ ] uniform config + - [ ] fragment output config + - [ ] subroutines config - [ ] Clean code - [ ] Midi - [ ] Read Midi events diff --git a/shaders/frag0.glsl b/shaders/frag0.glsl index 1b8753e..6a8717c 100644 --- a/shaders/frag0.glsl +++ b/shaders/frag0.glsl @@ -855,13 +855,13 @@ subroutine vec4 src_stage_sub(vec2 vUV); subroutine uniform src_stage_sub src_stage; -subroutine(src_stage_sub) vec4 src_0(vec2 vUV) +subroutine(src_stage_sub) vec4 src_1(vec2 vUV) { // TODO tmp return vec4(vUV, 0.0, 0.0); } -subroutine(src_stage_sub) vec4 src_1(vec2 vUV) +subroutine(src_stage_sub) vec4 src_2(vec2 vUV) { // TODO tmp vec2 uv0 = vUV.st; @@ -873,7 +873,7 @@ subroutine(src_stage_sub) vec4 src_1(vec2 vUV) return mix(color, gauss(tex0, vUV - 0.01) * 0.5, f); } -subroutine(src_stage_sub) vec4 src_2(vec2 vUV) +subroutine(src_stage_sub) vec4 src_3(vec2 vUV) { const int text[5] = {0x66, 0x70, 0x73, 0x00, 0x00}; vec2 uv0 = vUV.st; @@ -890,12 +890,6 @@ subroutine(src_stage_sub) vec4 src_2(vec2 vUV) return vec4(v); } -subroutine(src_stage_sub) vec4 src_3(vec2 vUV) -{ - // TODO tmp - return vec4(vUV, 0.0, 0.0); -} - subroutine(src_stage_sub) vec4 src_4(vec2 vUV) { // TODO tmp @@ -968,6 +962,12 @@ subroutine(src_stage_sub) vec4 src_15(vec2 vUV) return vec4(vUV, 0.0, 0.0); } +subroutine(src_stage_sub) vec4 src_16(vec2 vUV) +{ + // TODO tmp + return vec4(vUV, 0.0, 0.0); +} + // 6. effects // ---------- @@ -975,22 +975,16 @@ subroutine vec4 fx_stage_sub(vec2 vUV, sampler2D previous, sampler2D feedback); subroutine uniform fx_stage_sub fx_stage; -subroutine(fx_stage_sub) vec4 fx_0(vec2 vUV, sampler2D previous, sampler2D feedback) -{ - // TODO tmp - return texture(previous, vUV); -} - subroutine(fx_stage_sub) vec4 fx_1(vec2 vUV, sampler2D previous, sampler2D feedback) { // TODO tmp - return gauss(previous, vUV); + return texture(previous, vUV); } subroutine(fx_stage_sub) vec4 fx_2(vec2 vUV, sampler2D previous, sampler2D feedback) { // TODO tmp - return texture(previous, vUV); + return gauss(previous, vUV); } subroutine(fx_stage_sub) vec4 fx_3(vec2 vUV, sampler2D previous, sampler2D feedback) @@ -1071,6 +1065,12 @@ subroutine(fx_stage_sub) vec4 fx_15(vec2 vUV, sampler2D previous, sampler2D feed return texture(previous, vUV); } +subroutine(fx_stage_sub) vec4 fx_16(vec2 vUV, sampler2D previous, sampler2D feedback) +{ + // TODO tmp + return texture(previous, vUV); +} + // 7. mix // ---------- @@ -1078,7 +1078,7 @@ subroutine vec4 mix_stage_sub(vec2 vUV, sampler2D tex_a, sampler2D tex_a, float subroutine uniform mix_stage_sub mix_stage; -subroutine(mix_stage_sub) vec4 mix_0(vec2 vUV, sampler2D ta, sampler2D tb, float lvl) +subroutine(mix_stage_sub) vec4 mix_1(vec2 vUV, sampler2D ta, sampler2D tb, float lvl) { vec4 color_a = texture(ta, vUV); vec4 color_b = texture(tb, vUV); @@ -1086,7 +1086,7 @@ subroutine(mix_stage_sub) vec4 mix_0(vec2 vUV, sampler2D ta, sampler2D tb, float return color_a + color_b;// TODOmix(color_b, color_a, lvl); } -subroutine(mix_stage_sub) vec4 mix_1(vec2 vUV, sampler2D ta, sampler2D tb, float lvl) +subroutine(mix_stage_sub) vec4 mix_2(vec2 vUV, sampler2D ta, sampler2D tb, float lvl) { vec4 color_a = texture(ta, vUV); vec4 color_b = texture(tb, vUV); diff --git a/shaders/shaders.cfg b/shaders/shaders.cfg index 7c46c1d..b032631 100644 --- a/shaders/shaders.cfg +++ b/shaders/shaders.cfg @@ -1,8 +1,21 @@ -SUB_COUNT=16 +UNIFORM_TIME=iTime +UNIFORM_TEMPO=iTempo +UNIFORM_FPS=iFPS +UNIFORM_RESOLUTION=iResolution + FRAG_COUNT=6 + FRAG_OUT_1=2 FRAG_OUT_2=5 FRAG_OUT_3=3 FRAG_OUT_4=6 FRAG_OUT_5=7 -FRAG_OUT_6=0 \ No newline at end of file +FRAG_OUT_6=0 + +SUB_TYPE_COUNT=3 +SUB_1_PREFIX=src_ +SUB_1_COUNT=16 +SUB_2_PREFIX=fx_ +SUB_2_COUNT=16 +SUB_3_PREFIX=mix_ +SUB_3_COUNT=2 diff --git a/src/forge.c b/src/forge.c index 9be8bef..40e6741 100644 --- a/src/forge.c +++ b/src/forge.c @@ -4,6 +4,7 @@ #include #include "config.h" +#include "config_file.h" #include "file.h" #include "forge.h" #include "logs.h" @@ -126,15 +127,18 @@ void forge_run(Parameters params) { Window *window; Timer timer; Context context; + ConfigFile shader_config; init_files(params.frag_path, &common_shader_code, fragment_shaders); + shader_config = config_file_read(params.frag_config_path, false); + window = window_init(PACKAGE " " VERSION, params.screen, error_callback, key_callback); context = window_get_context(window); - program = shaders_init(fragment_shaders, context); + program = shaders_init(fragment_shaders, shader_config, context); if (program.error) { window_close(window, true); @@ -151,4 +155,6 @@ void forge_run(Parameters params) { window_close(window, true); free_files(&common_shader_code, fragment_shaders); + + config_file_free(shader_config); } \ No newline at end of file diff --git a/src/shaders.c b/src/shaders.c index ba9ccf8..dad6cfd 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -160,14 +160,14 @@ static void init_single_program(ShaderProgram *program, unsigned int i, glGetUniformLocation(program->programs[i], "iResolution"); for (j = 0; j < SUB_COUNT; j++) { - sprintf(name, "src_%d", j); + sprintf(name, "src_%d", j + 1); program->sub_src_indexes[i][j] = glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name); - sprintf(name, "fx_%d", j); + sprintf(name, "fx_%d", j + 1); program->sub_fx_indexes[i][j] = glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name); if (j < 2) { - sprintf(name, "mix_%d", j); + sprintf(name, "mix_%d", j + 1); program->sub_mix_indexes[i][j] = glGetSubroutineIndex( program->programs[i], GL_FRAGMENT_SHADER, name); } @@ -194,7 +194,8 @@ static void init_single_program(ShaderProgram *program, unsigned int i, log_success("Program %d initialized", i + 1); } -ShaderProgram shaders_init(File *fragment_shaders, Context context) { +ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, + Context context) { unsigned int i; ShaderProgram program; diff --git a/src/shaders.h b/src/shaders.h index 65f3ad5..12fca2b 100644 --- a/src/shaders.h +++ b/src/shaders.h @@ -3,7 +3,8 @@ #ifndef SHADERS_H #define SHADERS_H -ShaderProgram shaders_init(File *fragment_shader, Context context); +ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, + Context context); void shaders_update(ShaderProgram program, File *fragment_shaders, unsigned int i);