From 4cc1fa2111848a78536e54ea34d9720d4f995dac Mon Sep 17 00:00:00 2001 From: julia Date: Tue, 14 Jan 2025 10:13:09 +1100 Subject: [PATCH] render consecutive shaders to the fbo not that big. see comments --- src/renderer/OpenGL.zig | 22 +++++++++++++++++----- src/renderer/opengl/custom.zig | 1 - 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index e5dec6b2b..8b6552bb9 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -2350,11 +2350,9 @@ pub fn drawFrame(self: *OpenGL, surface: *apprt.Surface) !void { } /// Draw the custom shaders. -fn drawCustomPrograms( - self: *OpenGL, - custom_state: *custom.State, -) !void { +fn drawCustomPrograms(self: *OpenGL, custom_state: *custom.State) !void { _ = self; + assert(custom_state.programs.len > 0); // Bind our state that is global to all custom shaders const custom_bind = try custom_state.bind(); @@ -2363,8 +2361,22 @@ fn drawCustomPrograms( // Setup the new frame try custom_state.newFrame(); + // To allow programs to retrieve each other via a texture + // then we must render the next shaders to the screen fbo. + // However, the first shader must be run while the default fbo + // is attached + { + const bind = try custom_state.programs[0].bind(); + defer bind.unbind(); + try bind.draw(); + if (custom_state.programs.len == 1) return; + } + + const fbobind = try custom_state.fbo.bind(.framebuffer); + defer fbobind.unbind(); + // Go through each custom shader and draw it. - for (custom_state.programs) |program| { + for (custom_state.programs[1..]) |program| { // Bind our cell program state, buffers const bind = try program.bind(); defer bind.unbind(); diff --git a/src/renderer/opengl/custom.zig b/src/renderer/opengl/custom.zig index 2cab0940c..3806921df 100644 --- a/src/renderer/opengl/custom.zig +++ b/src/renderer/opengl/custom.zig @@ -251,7 +251,6 @@ pub const Program = struct { const program = try gl.Program.createVF( @embedFile("../shaders/custom.v.glsl"), src, - //@embedFile("../shaders/temp.f.glsl"), ); errdefer program.destroy();