mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 07:46:12 +03:00
render consecutive shaders to the fbo (opengl) (#5037)
fixes #4729 allows the shaders to sample each other via the fbo texture. also, a better example would use the full screen e.g.: "behind.glsl" ```glsl void mainImage( out vec4 fragColor, in vec2 fragCoord ) { fragColor = vec4(fragCoord/iResolution.xy, 0.0, 1.0); } ``` "infront.glsl" ```glsl void mainImage( out vec4 fragColor, in vec2 fragCoord ) { fragColor = texture(iChannel0, fragCoord/iResolution.xy); } ``` `ghostty --custom-shader=behind.glsl --custom-shader=infront.glsl` |before|after| |-|-| |  | |
This commit is contained in:
@ -2350,11 +2350,9 @@ pub fn drawFrame(self: *OpenGL, surface: *apprt.Surface) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Draw the custom shaders.
|
/// Draw the custom shaders.
|
||||||
fn drawCustomPrograms(
|
fn drawCustomPrograms(self: *OpenGL, custom_state: *custom.State) !void {
|
||||||
self: *OpenGL,
|
|
||||||
custom_state: *custom.State,
|
|
||||||
) !void {
|
|
||||||
_ = self;
|
_ = self;
|
||||||
|
assert(custom_state.programs.len > 0);
|
||||||
|
|
||||||
// Bind our state that is global to all custom shaders
|
// Bind our state that is global to all custom shaders
|
||||||
const custom_bind = try custom_state.bind();
|
const custom_bind = try custom_state.bind();
|
||||||
@ -2363,8 +2361,22 @@ fn drawCustomPrograms(
|
|||||||
// Setup the new frame
|
// Setup the new frame
|
||||||
try custom_state.newFrame();
|
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.
|
// 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
|
// Bind our cell program state, buffers
|
||||||
const bind = try program.bind();
|
const bind = try program.bind();
|
||||||
defer bind.unbind();
|
defer bind.unbind();
|
||||||
|
@ -251,7 +251,6 @@ pub const Program = struct {
|
|||||||
const program = try gl.Program.createVF(
|
const program = try gl.Program.createVF(
|
||||||
@embedFile("../shaders/custom.v.glsl"),
|
@embedFile("../shaders/custom.v.glsl"),
|
||||||
src,
|
src,
|
||||||
//@embedFile("../shaders/temp.f.glsl"),
|
|
||||||
);
|
);
|
||||||
errdefer program.destroy();
|
errdefer program.destroy();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user