From 1cf3c7eb50438a57991fdab554c48ff294141189 Mon Sep 17 00:00:00 2001 From: klemek Date: Fri, 19 Sep 2025 00:06:50 +0200 Subject: [PATCH] any buffer to any tex --- shaders/frag1.glsl | 2 +- shaders/frag2.glsl | 2 +- shaders/frag3.glsl | 2 +- shaders/frag4.glsl | 2 +- shaders/frag5.glsl | 2 +- shaders/frag6.glsl | 2 +- shaders/shaders.cfg | 8 +++++++- src/shaders.c | 42 ++++++++++++++++++------------------------ 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/shaders/frag1.glsl b/shaders/frag1.glsl index 1facad5..1740412 100644 --- a/shaders/frag1.glsl +++ b/shaders/frag1.glsl @@ -5,7 +5,7 @@ // OUT: 2 (FX A) in vec2 vUV; -layout(location = 2) out vec4 fragColor; +out vec4 fragColor; void main() { fragColor = src_stage(vUV); diff --git a/shaders/frag2.glsl b/shaders/frag2.glsl index 3d4f6fa..46043ed 100644 --- a/shaders/frag2.glsl +++ b/shaders/frag2.glsl @@ -5,7 +5,7 @@ // OUT: 5 (FX B) in vec2 vUV; -layout(location = 5) out vec4 fragColor; +out vec4 fragColor; void main() { fragColor = src_stage(vUV); diff --git a/shaders/frag3.glsl b/shaders/frag3.glsl index a9191a7..c3a8402 100644 --- a/shaders/frag3.glsl +++ b/shaders/frag3.glsl @@ -5,7 +5,7 @@ // OUT: 3 (A+B) in vec2 vUV; -layout(location = 3) out vec4 fragColor; +out vec4 fragColor; void main() { fragColor = fx_stage(vUV, tex2, tex3); diff --git a/shaders/frag4.glsl b/shaders/frag4.glsl index 8bbf282..0f287e8 100644 --- a/shaders/frag4.glsl +++ b/shaders/frag4.glsl @@ -5,7 +5,7 @@ // OUT: 6 (A+B) in vec2 vUV; -layout(location = 6) out vec4 fragColor; +out vec4 fragColor; void main() { fragColor = fx_stage(vUV, tex5, tex6); diff --git a/shaders/frag5.glsl b/shaders/frag5.glsl index 080dcb6..f684c42 100644 --- a/shaders/frag5.glsl +++ b/shaders/frag5.glsl @@ -5,7 +5,7 @@ // OUT: 7 (MFX) in vec2 vUV; -layout(location = 7) out vec4 fragColor; +out vec4 fragColor; void main() { fragColor = mix_stage(vUV, tex3, tex6, sin(iTime * 0.25) * 0.3 + 0.3); // TODO tmp diff --git a/shaders/frag6.glsl b/shaders/frag6.glsl index ef2cbb9..c0f86c3 100644 --- a/shaders/frag6.glsl +++ b/shaders/frag6.glsl @@ -5,7 +5,7 @@ // OUT: 0 (OUT) in vec2 vUV; -layout(location = 0) out vec4 fragColor; +out vec4 fragColor; void main() { fragColor = fx_stage(vUV, tex7, tex0); diff --git a/shaders/shaders.cfg b/shaders/shaders.cfg index f00a576..b788cf2 100644 --- a/shaders/shaders.cfg +++ b/shaders/shaders.cfg @@ -4,8 +4,14 @@ UNIFORM_FPS=iFPS UNIFORM_RESOLUTION=iResolution FRAG_COUNT=8 -FRAG_OUT=7 +FRAG_OUTPUT=7 FRAG_MONITOR=8 +FRAG_1_OUT=2 +FRAG_2_OUT=5 +FRAG_3_OUT=3 +FRAG_4_OUT=6 +FRAG_5_OUT=7 +FRAG_6_OUT=0 SUB_TYPE_COUNT=3 SUB_1_PREFIX=src_ diff --git a/src/shaders.c b/src/shaders.c index fd04a48..fc2d156 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -59,22 +59,27 @@ static void init_textures(ShaderProgram *program, Context context) { } } -static void init_framebuffers(ShaderProgram *program) { +static void init_framebuffers(ShaderProgram *program, + ConfigFile shader_config) { unsigned int i, j; + unsigned tex_i; + char name[32]; - program->frame_buffers = malloc(program->framebuffer_count * sizeof(GLuint)); + program->frame_buffers = malloc(program->frag_count * sizeof(GLuint)); - glGenFramebuffers(program->framebuffer_count, program->frame_buffers); + glGenFramebuffers(program->frag_count, program->frame_buffers); + + for (i = 0; i < program->frag_count; i++) { + if (i == program->frag_output_index || i == program->frag_monitor_index) { + continue; + } - for (i = 0; i < program->framebuffer_count; i++) { glBindFramebuffer(GL_FRAMEBUFFER, program->frame_buffers[i]); - for (j = 0; j < TEX_COUNT; j++) { - // attaches a selected mipmap level or image of a texture object as one of - // the logical buffers of the framebuffer object - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + j, - GL_TEXTURE_2D, program->textures[j], 0); - } + sprintf(name, "FRAG_%d_OUT", i + 1); + tex_i = config_file_get_int(shader_config, name, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + program->textures[tex_i], 0); // check framebuffer status if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -206,14 +211,6 @@ static void init_programs(ShaderProgram *program, ConfigFile shader_config) { } } -static void init_drawbuffers(ShaderProgram *program) { - unsigned int i; - - for (i = 0; i < TEX_COUNT; i++) { - program->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; - } -} - ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, Context context) { ShaderProgram program; @@ -230,7 +227,7 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, init_textures(&program, context); - init_framebuffers(&program); + init_framebuffers(&program, shader_config); init_shaders(&program, fragment_shaders); @@ -242,8 +239,6 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, init_programs(&program, shader_config); - init_drawbuffers(&program); - return program; } @@ -300,6 +295,7 @@ static void use_program(ShaderProgram program, int i, bool output, } else { // use memory framebuffer glBindFramebuffer(GL_FRAMEBUFFER, program.frame_buffers[i]); + glDrawBuffer(GL_COLOR_ATTACHMENT0); } // set fragment uniforms glUniform1f(program.itime_locations[i], (const GLfloat)context.time); @@ -320,8 +316,6 @@ static void use_program(ShaderProgram program, int i, bool output, glUniform1i(program.textures_locations[j][i], j); } - glDrawBuffers(TEX_COUNT, program.draw_buffers); - // draw output glDrawArrays(GL_TRIANGLES, 0, 6); } @@ -337,5 +331,5 @@ void shaders_apply(ShaderProgram program, Context context) { } } - use_program(program, program.frag_output_index, true, context); + use_program(program, program.frag_monitor_index, true, context); }