Files
fn_registry/cpp/functions/gfx/gl_loader.md
T
egutierrez 4a95407d0e feat(shaders_lab): add gl_loader + Windows cross-compile
- cpp/functions/gfx/gl_loader.{h,cpp,md}: mini loader para OpenGL 2.0+
  (Linux no-op via GL_GLEXT_PROTOTYPES, Windows wglGetProcAddress)
- Portar gl_shader/gl_framebuffer/fullscreen_quad/shader_canvas al loader
- CMakeLists: WIN32_EXECUTABLE para lanzar sin consola en Windows
- apps/shaders_lab/shaders_lab.exe: binario PE32+ precompilado

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 20:52:37 +02:00

2.1 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, framework, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path framework params output
gl_loader function cpp gfx 1.0.0 impure bool gl_loader_init() Loader minimo de simbolos OpenGL 2.0+ para cross-compile a Windows. En Linux es no-op (simbolos resueltos via GL_GLEXT_PROTOTYPES). En Windows resuelve punteros con wglGetProcAddress. Redirige las llamadas con macros para que el codigo fuente sea portable.
opengl
loader
windows
cross-compile
gfx
false error_go_core
windows.h
GL/gl.h
GL/glext.h
false
cpp/functions/gfx/gl_loader.cpp opengl
true si todos los simbolos se resolvieron (Linux siempre true; Windows depende de que el contexto GL este activo antes de llamar). false si algun simbolo no esta disponible en el driver.

gl_loader

Loader minimo de simbolos OpenGL 2.0+ sin dependencias externas (sin GLAD, GLEW, gl3w). Resuelve el problema de que opengl32.dll en Windows solo exporta OpenGL 1.1 — todo lo moderno (shaders, FBO, VAO) requiere resolucion dinamica via wglGetProcAddress.

Uso

#include "gfx/gl_loader.h"

// Despues de crear el contexto GL (p.ej. tras el primer frame de ImGui):
fn::gfx::gl_loader_init();

// A partir de aqui, todos los simbolos funcionan identicamente en Linux y Windows:
glCreateShader(GL_FRAGMENT_SHADER);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// ...

Como funciona

En Windows, el header declara extern PFNGL... por cada simbolo y los renombra con macros: #define glCreateShader fn_glCreateShader. El .cpp instancia los punteros y los resuelve con wglGetProcAddress en gl_loader_init().

En Linux, el header activa GL_GLEXT_PROTOTYPES e incluye <GL/gl.h> + <GL/glext.h> directamente; los simbolos son exportados por libGL y no hace falta resolver nada.

Anadir un simbolo nuevo

  1. Declarar extern PFNGL<NAME>PROC fn_gl<Name>; en el .h.
  2. Anadir #define gl<Name> fn_gl<Name> en el bloque #ifdef _WIN32.
  3. Instanciar el puntero en el .cpp y anadir LOAD(gl<Name>); dentro de gl_loader_init().