any buffer to any tex

This commit is contained in:
2025-09-19 00:06:50 +02:00
parent b00b0d0f33
commit 1cf3c7eb50
8 changed files with 31 additions and 31 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
// OUT: 2 (FX A) // OUT: 2 (FX A)
in vec2 vUV; in vec2 vUV;
layout(location = 2) out vec4 fragColor; out vec4 fragColor;
void main() { void main() {
fragColor = src_stage(vUV); fragColor = src_stage(vUV);
+1 -1
View File
@@ -5,7 +5,7 @@
// OUT: 5 (FX B) // OUT: 5 (FX B)
in vec2 vUV; in vec2 vUV;
layout(location = 5) out vec4 fragColor; out vec4 fragColor;
void main() { void main() {
fragColor = src_stage(vUV); fragColor = src_stage(vUV);
+1 -1
View File
@@ -5,7 +5,7 @@
// OUT: 3 (A+B) // OUT: 3 (A+B)
in vec2 vUV; in vec2 vUV;
layout(location = 3) out vec4 fragColor; out vec4 fragColor;
void main() { void main() {
fragColor = fx_stage(vUV, tex2, tex3); fragColor = fx_stage(vUV, tex2, tex3);
+1 -1
View File
@@ -5,7 +5,7 @@
// OUT: 6 (A+B) // OUT: 6 (A+B)
in vec2 vUV; in vec2 vUV;
layout(location = 6) out vec4 fragColor; out vec4 fragColor;
void main() { void main() {
fragColor = fx_stage(vUV, tex5, tex6); fragColor = fx_stage(vUV, tex5, tex6);
+1 -1
View File
@@ -5,7 +5,7 @@
// OUT: 7 (MFX) // OUT: 7 (MFX)
in vec2 vUV; in vec2 vUV;
layout(location = 7) out vec4 fragColor; out vec4 fragColor;
void main() { void main() {
fragColor = mix_stage(vUV, tex3, tex6, sin(iTime * 0.25) * 0.3 + 0.3); // TODO tmp fragColor = mix_stage(vUV, tex3, tex6, sin(iTime * 0.25) * 0.3 + 0.3); // TODO tmp
+1 -1
View File
@@ -5,7 +5,7 @@
// OUT: 0 (OUT) // OUT: 0 (OUT)
in vec2 vUV; in vec2 vUV;
layout(location = 0) out vec4 fragColor; out vec4 fragColor;
void main() { void main() {
fragColor = fx_stage(vUV, tex7, tex0); fragColor = fx_stage(vUV, tex7, tex0);
+7 -1
View File
@@ -4,8 +4,14 @@ UNIFORM_FPS=iFPS
UNIFORM_RESOLUTION=iResolution UNIFORM_RESOLUTION=iResolution
FRAG_COUNT=8 FRAG_COUNT=8
FRAG_OUT=7 FRAG_OUTPUT=7
FRAG_MONITOR=8 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_TYPE_COUNT=3
SUB_1_PREFIX=src_ SUB_1_PREFIX=src_
+18 -24
View File
@@ -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 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]); glBindFramebuffer(GL_FRAMEBUFFER, program->frame_buffers[i]);
for (j = 0; j < TEX_COUNT; j++) { sprintf(name, "FRAG_%d_OUT", i + 1);
// attaches a selected mipmap level or image of a texture object as one of tex_i = config_file_get_int(shader_config, name, 0);
// the logical buffers of the framebuffer object glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + j, program->textures[tex_i], 0);
GL_TEXTURE_2D, program->textures[j], 0);
}
// check framebuffer status // check framebuffer status
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 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, ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config,
Context context) { Context context) {
ShaderProgram program; ShaderProgram program;
@@ -230,7 +227,7 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config,
init_textures(&program, context); init_textures(&program, context);
init_framebuffers(&program); init_framebuffers(&program, shader_config);
init_shaders(&program, fragment_shaders); init_shaders(&program, fragment_shaders);
@@ -242,8 +239,6 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config,
init_programs(&program, shader_config); init_programs(&program, shader_config);
init_drawbuffers(&program);
return program; return program;
} }
@@ -300,6 +295,7 @@ static void use_program(ShaderProgram program, int i, bool output,
} else { } else {
// use memory framebuffer // use memory framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, program.frame_buffers[i]); glBindFramebuffer(GL_FRAMEBUFFER, program.frame_buffers[i]);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
} }
// set fragment uniforms // set fragment uniforms
glUniform1f(program.itime_locations[i], (const GLfloat)context.time); 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); glUniform1i(program.textures_locations[j][i], j);
} }
glDrawBuffers(TEX_COUNT, program.draw_buffers);
// draw output // draw output
glDrawArrays(GL_TRIANGLES, 0, 6); 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);
} }