feat(shaders_lab): scaffold C++ app with GLSL live-reload canvas
- cpp/functions/gfx: gl_shader, gl_framebuffer, fullscreen_quad, shader_canvas - cpp/apps/shaders_lab: main + 3 seed shaders (plasma, circle, checker) - ImGui docking layout: Code | Canvas | Controls Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
---
|
||||
name: shader_canvas
|
||||
kind: component
|
||||
lang: cpp
|
||||
domain: gfx
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "void canvas_render(ShaderCanvas& c, float time_seconds)"
|
||||
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."
|
||||
tags: [opengl, shader, canvas, imgui, fbo, gfx, component]
|
||||
uses_functions:
|
||||
- gl_shader_cpp_gfx
|
||||
- gl_framebuffer_cpp_gfx
|
||||
- fullscreen_quad_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."
|
||||
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.
|
||||
Reference in New Issue
Block a user