--- 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: ["gl_loader_cpp_gfx"] 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(static_cast(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.