--- 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: ["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_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." notes: "consumido por cpp/apps/shaders_lab/main.cpp; scaffolding/demo en primitives_gallery" --- # 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` + `` + `` (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.