Files
fn_registry/cpp/functions/gfx/gl_shader.md
T
egutierrez 042bb43b37 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>
2026-04-24 20:33:36 +02:00

67 lines
2.0 KiB
Markdown

---
name: gl_shader
kind: function
lang: cpp
domain: gfx
version: "1.0.0"
purity: impure
signature: "CompileResult compile_fragment(const std::string& user_fragment_src)"
description: "Compila un cuerpo de fragment shader GLSL 330 y retorna un GL program listo para usar. Prepende automáticamente version, out vec4 fragColor y uniforms u_resolution/u_time/u_mouse. Usa GL_GLEXT_PROTOTYPES + GL/glext.h."
tags: [opengl, shader, glsl, compile, fragment, gfx]
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_shader.cpp"
framework: opengl
params:
- name: user_fragment_src
desc: "Cuerpo del fragment shader GLSL sin #version, sin 'out vec4 fragColor' ni declaraciones de uniforms. Solo el void main() y funciones auxiliares."
output: "CompileResult con program=GL id si ok=true, o err_msg/err_line si falla. program=0 indica error."
---
# gl_shader
Compila y enlaza un fragment shader GLSL 330 contra un vertex shader fijo que genera un fullscreen quad via `gl_VertexID`.
## Vertex shader fijo
```glsl
#version 330 core
const vec2 verts[6] = vec2[](
vec2(-1,-1), vec2(1,-1), vec2(-1,1),
vec2(1,-1), vec2(1,1), vec2(-1,1)
);
void main() { gl_Position = vec4(verts[gl_VertexID], 0.0, 1.0); }
```
## Preamble prepended al fragment
```glsl
#version 330 core
out vec4 fragColor;
uniform vec2 u_resolution;
uniform float u_time;
uniform vec2 u_mouse;
```
## Ejemplo
```cpp
auto r = fn::gfx::compile_fragment("void main() { fragColor = vec4(1,0,0,1); }");
if (r.ok) {
glUseProgram(r.program);
} else {
fprintf(stderr, "line %d: %s\n", r.err_line, r.err_msg.c_str());
}
```
## Notas
Usa `#define GL_GLEXT_PROTOTYPES` + `<GL/gl.h>` + `<GL/glext.h>` (mismo patrón que `graph_renderer`). El loader de ImGui ya ha inicializado los symbols GL antes de que esta función sea llamada. El err_line del fragment se ajusta restando las 4 líneas del preamble.