diff --git a/pkg/opengl/Texture.zig b/pkg/opengl/Texture.zig index 4cd1cf9f9..a9fa5d4fe 100644 --- a/pkg/opengl/Texture.zig +++ b/pkg/opengl/Texture.zig @@ -162,4 +162,26 @@ pub const Binding = struct { data, ); } + + pub fn copySubImage2D( + b: Binding, + level: c.GLint, + xoffset: c.GLint, + yoffset: c.GLint, + x: c.GLint, + y: c.GLint, + width: c.GLsizei, + height: c.GLsizei, + ) !void { + glad.context.CopyTexSubImage2D.?( + @intFromEnum(b.target), + level, + xoffset, + yoffset, + x, + y, + width, + height + ); + } }; diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index 80fc3cab9..9fdd1a547 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -2363,26 +2363,18 @@ fn drawCustomPrograms(self: *OpenGL, custom_state: *custom.State) !void { // 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(); + // const fbobind = try custom_state.fbo.bind(.framebuffer); + // defer fbobind.unbind(); // Go through each custom shader and draw it. - for (custom_state.programs[1..]) |program| { + for (custom_state.programs) |program| { // Bind our cell program state, buffers const bind = try program.bind(); defer bind.unbind(); try bind.draw(); + + // copy main and custom fbo + try custom_state.copy(); } } diff --git a/src/renderer/opengl/custom.zig b/src/renderer/opengl/custom.zig index 3806921df..a69fc8b2b 100644 --- a/src/renderer/opengl/custom.zig +++ b/src/renderer/opengl/custom.zig @@ -230,6 +230,14 @@ pub const State = struct { }; } + /// copy the fbo's attached texture to the backbuffer + pub fn copy(self: *State) !void { + const texbind = try self.fb_texture.bind(.@"2D"); + errdefer texbind.unbind(); + + try texbind.copySubImage2D(0, 0, 0, 0, 0, @intFromFloat(self.uniforms.resolution[0]), @intFromFloat(self.uniforms.resolution[1])); + } + pub const Binding = struct { vao: gl.VertexArray.Binding, ebo: gl.Buffer.Binding,