--- name: gl_loader kind: function lang: cpp domain: gfx version: "1.0.0" purity: impure signature: "bool gl_loader_init()" description: "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." tags: [opengl, loader, windows, cross-compile, gfx] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [windows.h, GL/gl.h, GL/glext.h] tested: false tests: [] test_file_path: "" file_path: "cpp/functions/gfx/gl_loader.cpp" framework: opengl params: [] output: "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 ```cpp #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 `` + `` directamente; los simbolos son exportados por libGL y no hace falta resolver nada. ## Anadir un simbolo nuevo 1. Declarar `extern PFNGLPROC fn_gl;` en el `.h`. 2. Anadir `#define gl fn_gl` en el bloque `#ifdef _WIN32`. 3. Instanciar el puntero en el `.cpp` y anadir `LOAD(gl);` dentro de `gl_loader_init()`.