Files
fn_registry/cpp/functions/gfx/shader_canvas.md
T
egutierrez 37ca9562c3 chore(registry): añadir uses_functions a consumidores reales (gfx)
Auditoria del issue 0044: 14 archivos .md de cpp/functions/gfx/ con
uses_functions actualizado. Resuelve dependencias detectadas via
#include: gl_loader (consumido por casi todo el dominio gfx),
dag_catalog (consumido por la familia dag_*), fullscreen_quad,
gl_framebuffer, gl_shader, mesh_obj_load, uniform_parser y
dag_node_previews.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:40:31 +02:00

66 lines
2.4 KiB
Markdown

---
name: shader_canvas
kind: component
lang: cpp
domain: gfx
version: "1.1.0"
purity: impure
signature: "void canvas_render(ShaderCanvas& c, float time_seconds, const std::function<void(unsigned int)>& uniforms_fn = {})"
description: "Componente ImGui que renderiza un fragment shader GLSL a un FBO y lo muestra en el panel actual. Compone gl_framebuffer, fullscreen_quad y gl_shader. Gestiona resize automático y coordenadas de mouse. Acepta callback opcional uniforms_fn invocado tras glUseProgram para uniforms custom."
tags: [opengl, shader, canvas, imgui, fbo, gfx, component]
uses_functions:
- fullscreen_quad_cpp_gfx
- gl_framebuffer_cpp_gfx
- gl_loader_cpp_gfx
- gl_shader_cpp_gfx
- uniform_panel_cpp_gfx
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [imgui, GL/gl.h, GL/glext.h]
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/gfx/shader_canvas.cpp"
framework: imgui
params:
- name: c
desc: "ShaderCanvas con estado GL interno (fb, quad, program). Inicializar con canvas_init() antes del primer frame."
- name: time_seconds
desc: "Tiempo en segundos para el uniform u_time. Usar ImGui::GetTime() o clock propio."
- name: uniforms_fn
desc: "Callback opcional invocado tras glUseProgram y antes de quad_draw. Recibe el program ID. Usar para aplicar uniforms custom (ej: uniforms_apply de uniform_panel)."
output: "Dibuja ImGui::Image con la textura del FBO renderizado. El panel ImGui debe estar abierto (entre Begin/End). Ocupa GetContentRegionAvail()."
---
# shader_canvas
Componente que encapsula el ciclo render-to-FBO + ImGui::Image. Llama a `canvas_render()` dentro de un `ImGui::Begin/End` activo.
## Ciclo de vida
```cpp
fn::gfx::ShaderCanvas canvas{};
// En el render loop:
if (!canvas.initialized) fn::gfx::canvas_init(canvas);
// Cargar un shader compilado:
auto r = fn::gfx::compile_fragment(src);
if (r.ok) fn::gfx::canvas_set_program(canvas, r.program);
// Dentro de ImGui::Begin/End:
fn::gfx::canvas_render(canvas, (float)ImGui::GetTime());
// Al destruir:
fn::gfx::canvas_destroy(canvas);
```
## Notas
- `canvas_set_program` borra el programa anterior automáticamente.
- `canvas_set_program(c, 0)` deja la pantalla en negro (glClear sin draw call).
- El flip de coordenadas UV (`ImVec2(0,1)` / `ImVec2(1,0)`) corrige el origen OpenGL bottom-left vs ImGui top-left.
- Guarda y restaura `GL_FRAMEBUFFER_BINDING` y `GL_VIEWPORT` para compatibilidad con el render loop de ImGui.