any buffer to any tex
This commit is contained in:
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+7
-1
@@ -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_
|
||||
|
||||
+18
-24
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user