---
name: gl_framebuffer
kind: function
lang: cpp
domain: gfx
version: "1.0.0"
purity: impure
signature: "void fb_init(Framebuffer& f); void fb_resize(Framebuffer& f, int w, int h); void fb_destroy(Framebuffer& f)"
description: "CRUD de un framebuffer OpenGL (FBO + textura RGBA8). fb_resize es no-op si las dimensiones no cambian. Listo para uso con ImGui::Image."
tags: [opengl, framebuffer, fbo, texture, gfx, offscreen]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [GL/gl.h, GL/glext.h]
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/gfx/gl_framebuffer.cpp"
framework: opengl
params:
  - name: f
    desc: "Struct Framebuffer con campos fbo, tex (GL ids), width, height. Inicializar a {0} antes de fb_init."
  - name: w
    desc: "Ancho deseado en pixels (fb_resize)"
  - name: h
    desc: "Alto deseado en pixels (fb_resize)"
output: "Modifica f in-place. Después de fb_init, f.fbo y f.tex son IDs GL válidos. fb_destroy pone todos los campos a 0."
---

# gl_framebuffer

FBO con textura color RGBA8 (GL_CLAMP_TO_EDGE, GL_LINEAR). Diseñado para renderizado offscreen y posterior display via `ImGui::Image`.

## Ciclo de vida

```cpp
fn::gfx::Framebuffer fb{};
fn::gfx::fb_init(fb);          // fbo + tex 1x1

// En el render loop:
fn::gfx::fb_resize(fb, w, h);  // no-op si mismas dimensiones

// Al destruir:
fn::gfx::fb_destroy(fb);
```

## Uso con ImGui::Image

```cpp
// Flip Y porque OpenGL tiene origen bottom-left
ImGui::Image(
    reinterpret_cast<ImTextureID>(static_cast<uintptr_t>(fb.tex)),
    size,
    ImVec2(0, 1), ImVec2(1, 0)
);
```

## Notas

`fb_resize` recrea solo la textura (no el FBO) cuando las dimensiones cambian, reattachando la nueva textura al FBO existente. Esto minimiza el overhead de resize.
