From 998c2cb22299b2fff40b59231c4c769c623d7c68 Mon Sep 17 00:00:00 2001 From: klemek Date: Thu, 18 Sep 2025 20:27:00 +0200 Subject: [PATCH] wip config --- Makefile.dev | 2 +- shaders/frag0.glsl | 1 + shaders/frag1.glsl | 6 +++--- shaders/frag2.glsl | 8 ++++---- shaders/frag3.glsl | 10 +++++----- shaders/frag4.glsl | 4 ++-- shaders/frag5.glsl | 4 ++-- shaders/frag6.glsl | 2 +- shaders/shaders.cfg | 8 ++++++++ src/args.c | 20 +++++++++++++++----- src/config.h | 2 +- src/constants.h | 42 ++++++++++++++++++++++++++++++++++++------ src/shaders.c | 17 +++++++++++------ src/types.h | 4 +++- 14 files changed, 93 insertions(+), 37 deletions(-) create mode 100644 shaders/shaders.cfg diff --git a/Makefile.dev b/Makefile.dev index cc84e3c..eee3a18 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -1,6 +1,6 @@ TARGET ?= forge INSTALL_DIR ?= $(HOME)/.local/bin -TEST_ARGS ?= --hot-reload --frag=./shaders +TEST_ARGS ?= --hot-reload --frag=./shaders --frag-config=./shaders/shaders.cfg SHELL := /bin/bash .PHONY: build diff --git a/shaders/frag0.glsl b/shaders/frag0.glsl index 8d8561e..84c7801 100644 --- a/shaders/frag0.glsl +++ b/shaders/frag0.glsl @@ -22,6 +22,7 @@ uniform sampler2D frame4; uniform sampler2D frame5; uniform sampler2D frame6; uniform sampler2D frame7; +uniform sampler2D frame8; // 3. definitions // -------------- diff --git a/shaders/frag1.glsl b/shaders/frag1.glsl index 8f5f091..be6c81d 100644 --- a/shaders/frag1.glsl +++ b/shaders/frag1.glsl @@ -1,11 +1,11 @@ // SRC A // ----------- -// IN: 0 (MFX) +// IN: 0 (OUT) // IN: 1 (IN A) -// OUT: 3 (FX A) +// OUT: 2 (FX A) in vec2 vUV; -layout(location = 3) out vec3 fragColor; +layout(location = 2) out vec3 fragColor; void main() { fragColor = src_stage(vUV); diff --git a/shaders/frag2.glsl b/shaders/frag2.glsl index 31eb125..197c183 100644 --- a/shaders/frag2.glsl +++ b/shaders/frag2.glsl @@ -1,11 +1,11 @@ // SRC B // ----------- -// IN: 0 (MFX) -// IN: 2 (IN B) -// OUT: 4 (FX B) +// IN: 0 (OUT) +// IN: 4 (IN B) +// OUT: 5 (FX B) in vec2 vUV; -layout(location = 4) out vec3 fragColor; +layout(location = 5) out vec3 fragColor; void main() { fragColor = src_stage(vUV); diff --git a/shaders/frag3.glsl b/shaders/frag3.glsl index 08e061f..68bf8d8 100644 --- a/shaders/frag3.glsl +++ b/shaders/frag3.glsl @@ -1,12 +1,12 @@ // FX A // ------------- -// IN: 3 (SRC A) -// IN: 5 (FX A) -// OUT: 5 (A+B) +// IN: 2 (SRC A) +// IN: 3 (FX A) +// OUT: 3 (A+B) in vec2 vUV; -layout(location = 5) out vec3 fragColor; +layout(location = 3) out vec3 fragColor; void main() { - fragColor = fx_stage(vUV, frame3, frame5); + fragColor = fx_stage(vUV, frame2, frame3); } \ No newline at end of file diff --git a/shaders/frag4.glsl b/shaders/frag4.glsl index 3094979..2118d00 100644 --- a/shaders/frag4.glsl +++ b/shaders/frag4.glsl @@ -1,6 +1,6 @@ // FX B // ------------- -// IN: 4 (SRC B) +// IN: 5 (SRC B) // IN: 6 (FX B) // OUT: 6 (A+B) @@ -8,5 +8,5 @@ in vec2 vUV; layout(location = 6) out vec3 fragColor; void main() { - fragColor = fx_stage(vUV, frame4, frame6); + fragColor = fx_stage(vUV, frame5, frame6); } \ No newline at end of file diff --git a/shaders/frag5.glsl b/shaders/frag5.glsl index 806f4c5..bf87876 100644 --- a/shaders/frag5.glsl +++ b/shaders/frag5.glsl @@ -1,6 +1,6 @@ // A+B // ------------ -// IN: 5 (FX A) +// IN: 3 (FX A) // IN: 6 (FX B) // OUT: 7 (MFX) @@ -8,5 +8,5 @@ in vec2 vUV; layout(location = 7) out vec3 fragColor; void main() { - fragColor = mix_stage(vUV, frame5, frame6, sin(iTime * 0.25) * 0.3 + 0.3); // TODO tmp + fragColor = mix_stage(vUV, frame3, frame6, sin(iTime * 0.25) * 0.3 + 0.3); // TODO tmp } \ No newline at end of file diff --git a/shaders/frag6.glsl b/shaders/frag6.glsl index 7db7242..a8b7029 100644 --- a/shaders/frag6.glsl +++ b/shaders/frag6.glsl @@ -1,6 +1,6 @@ // MFX // ------------ -// IN: 7 (A+B) +// IN: 8 (A+B) // IN: 0 (OUT) // OUT: 0 (OUT) diff --git a/shaders/shaders.cfg b/shaders/shaders.cfg new file mode 100644 index 0000000..7c46c1d --- /dev/null +++ b/shaders/shaders.cfg @@ -0,0 +1,8 @@ +SUB_COUNT=16 +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 diff --git a/src/args.c b/src/args.c index f2dcbd7..7c5ccf2 100644 --- a/src/args.c +++ b/src/args.c @@ -18,14 +18,16 @@ static void print_help(int status_code) { "[-hr] " "[-s=SCREEN] " "[-f=DIR_PATH] " + "[-fc=CFG_PATH] " "\n\n" "Fusion Of Real-time Generative Effects.\n\n" "options:\n" - " -h, --help show this help message and exit\n" - " -v, --version print version\n" - " -hr, --hot-reload hot reload of shaders scripts\n" - " -s, --screen output screen number (default: primary)\n" - " -f, --frag fragment shaders directory (default: TODO)\n"); + " -h, --help show this help message and exit\n" + " -v, --version print version\n" + " -hr, --hot-reload hot reload of shaders scripts\n" + " -s, --screen output screen number (default: primary)\n" + " -f, --frag fragment shaders directory (default: TODO)\n" + " -fc, --frag-config fragment shaders config file (default: TODO)\n"); exit(status_code); } @@ -65,6 +67,7 @@ Parameters args_parse(int argc, char **argv) { params.screen = 0; params.frag_path = 0; + params.frag_config_path = 0; params.hot_reload = false; for (i = 1; i < argc; i++) { @@ -81,6 +84,8 @@ Parameters args_parse(int argc, char **argv) { params.screen = parse_uchar(arg, value); } else if (is_arg(arg, "-f") || is_arg(arg, "--frag")) { params.frag_path = value; + } else if (is_arg(arg, "-fc") || is_arg(arg, "--frag-config")) { + params.frag_config_path = value; } else { invalid_arg(arg); } @@ -91,5 +96,10 @@ Parameters args_parse(int argc, char **argv) { exit(EXIT_FAILURE); } + if (params.frag_path == 0) { + log_error("required argument -fc/--frag-config"); + exit(EXIT_FAILURE); + } + return params; } \ No newline at end of file diff --git a/src/config.h b/src/config.h index fa35645..dc65c9a 100644 --- a/src/config.h +++ b/src/config.h @@ -14,7 +14,7 @@ #endif /* FRAG_COUNT */ #ifndef TEX_COUNT -#define TEX_COUNT 8 +#define TEX_COUNT 9 #endif /* TEXT_COUNT */ #ifndef SUB_COUNT diff --git a/src/constants.h b/src/constants.h index f1524b6..3a23baf 100644 --- a/src/constants.h +++ b/src/constants.h @@ -15,15 +15,45 @@ static char *vertex_shader_text = " vUV = vPos;\n" "}\n"; -static char *output_fragment_shader_text = +static char *output_shader_text = "#version 460\n" + "in vec2 vUV;\n" + "out vec4 fragColor;\n" + "uniform sampler2D frame0;\n" + "void main()\n" + "{\n" + " fragColor = texture(frame0, vUV);\n" + "}"; + +static char *monitor_shader_text = "#version 460\n" + "uniform sampler2D frame0;\n" + "uniform sampler2D frame1;\n" + "uniform sampler2D frame2;\n" + "uniform sampler2D frame3;\n" + "uniform sampler2D frame4;\n" + "uniform sampler2D frame5;\n" + "uniform sampler2D frame6;\n" + "uniform sampler2D frame7;\n" + "uniform sampler2D frame8;\n" "in vec2 vUV;\n" "out vec4 fragColor;\n" - "uniform sampler2D frame0;\n" - "void main()\n" - "{\n" - " fragColor = texture(frame0, vUV);\n" - "}\n"; + "float s(vec2 uv, float x0, float y0) {\n" + " return step(x0, uv.x) * step(-x0 - 1, -uv.x) * step(y0, uv.y) * " + "step(-y0 - 1, -uv.y);\n" + "}\n" + "void main() {\n" + " vec2 uv = vUV * 3;\n" + " fragColor = vec4(0);\n" + " fragColor += s(uv,0,2) * texture(frame1, uv);\n" + " fragColor += s(uv,1,2) * texture(frame2, uv);\n" + " fragColor += s(uv,2,2) * texture(frame3, uv);\n" + " fragColor += s(uv,0,1) * texture(frame4, uv);\n" + " fragColor += s(uv,1,1) * texture(frame5, uv);\n" + " fragColor += s(uv,2,1) * texture(frame6, uv);\n" + " fragColor += s(uv,0,0) * texture(frame7, uv);\n" + " fragColor += s(uv,1,0) * texture(frame8, uv);\n" + " fragColor += s(uv,2,0) * texture(frame0, uv);\n" + "}"; static const Vertex vertices[6] = {{{0.0f, 0.0f}}, {{0.0f, 1.0f}}, {{1.0f, 1.0f}}, {{0.0f, 0.0f}}, diff --git a/src/shaders.c b/src/shaders.c index 52fcdbc..8f0ef72 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -107,10 +107,16 @@ static void init_shaders(ShaderProgram *program, File *fragment_shaders) { program->vertex_shader, "internal vertex shader", vertex_shader_text); // compile output fragment shader - program->output_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + program->output_shader = glCreateShader(GL_FRAGMENT_SHADER); program->error |= - !compile_shader(program->output_fragment_shader, - "internal fragment shader", output_fragment_shader_text); + !compile_shader(program->output_shader, + "internal fragment shader (output)", output_shader_text); + + // compile output fragment shader + program->monitor_shader = glCreateShader(GL_FRAGMENT_SHADER); + program->error |= !compile_shader(program->monitor_shader, + "internal fragment shader (monitor)", + monitor_shader_text); // compile fragment shaders for (i = 0; i < FRAG_COUNT; i++) { @@ -135,7 +141,7 @@ static void init_single_program(ShaderProgram *program, unsigned int i, glAttachShader(program->programs[i], program->vertex_shader); if (output) { - glAttachShader(program->programs[i], program->output_fragment_shader); + glAttachShader(program->programs[i], program->monitor_shader); // TODO tmp } else { glAttachShader(program->programs[i], program->fragment_shaders[i]); } @@ -213,7 +219,6 @@ ShaderProgram shaders_init(File *fragment_shaders, Context context) { init_single_program(&program, i, i == FRAG_COUNT); } - // TODO functions for (i = 0; i < TEX_COUNT; i++) { program.draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; } @@ -291,7 +296,7 @@ void shaders_apply(ShaderProgram program, Context context) { glUniform1i(program.frames_locations[i][j], j); } - glDrawBuffers(TEX_COUNT, program.draw_buffers); + glDrawBuffers(TEX_COUNT - 1, program.draw_buffers); // draw output glDrawArrays(GL_TRIANGLES, 0, 6); diff --git a/src/types.h b/src/types.h index 62ae677..7f9c05a 100644 --- a/src/types.h +++ b/src/types.h @@ -14,6 +14,7 @@ typedef struct Parameters { unsigned char screen; char *frag_path; + char *frag_config_path; bool hot_reload; } Parameters; @@ -37,7 +38,8 @@ typedef struct ShaderProgram { GLuint programs[FRAG_COUNT + 1]; GLuint vertex_shader; - GLuint output_fragment_shader; + GLuint output_shader; + GLuint monitor_shader; GLuint fragment_shaders[FRAG_COUNT];