9b1ca41c4d
- 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>
55 lines
2.1 KiB
Markdown
55 lines
2.1 KiB
Markdown
---
|
|
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 `<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()`.
|