https://github.com/kvbc/glez
Single-header C/C++ GL/GLES wrapper trading performance for convenience
https://github.com/kvbc/glez
opengl opengl-es single-header wrapper
Last synced: 2 months ago
JSON representation
Single-header C/C++ GL/GLES wrapper trading performance for convenience
- Host: GitHub
- URL: https://github.com/kvbc/glez
- Owner: kvbc
- Created: 2022-08-02T16:35:24.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2022-09-03T18:38:49.000Z (almost 4 years ago)
- Last Synced: 2025-11-01T11:27:55.456Z (9 months ago)
- Topics: opengl, opengl-es, single-header, wrapper
- Language: C
- Homepage:
- Size: 31.3 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# GLEZ
Single-header C/C++ GL/GLES wrapper trading performance for convenience
Wraps
- programs
- shaders
- textures
- vertex arrays (VAO)
# Why
Enough boilerplate for me, sir
# Examples
```c
struct glezResource * program = glez_program_create("program", 2,
glez_shader_createf("vertex shader", "shaders/vertex.glsl", GL_VERTEX_SHADER),
glez_shader_createf("fragment shader", "shaders/fragment.glsl", GL_FRAGMENT_SHADER)
);
```
Corresponding "raw" OpenGL code
```c
char * read_file (const char * const name) {
FILE * const f = fopen(name, "rb");
fseek(f, 0, SEEK_END);
long flen = ftell(f);
fseek(f, 0, SEEK_SET);
char * buf = malloc(sizeof(char) * (flen + 1));
buf[flen] = '\0';
fread(buf, sizeof(char), flen, f);
fclose(f);
return buf;
}
GLuint create_shader (const GLenum type, const char * const src) {
const GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, src, NULL);
glCompileShader(shader);
GLint compiled;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if (compiled == GL_FALSE) {
GLint infologlen;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologlen);
if (infologlen != 0) {
GLchar * const infolog = malloc(sizeof(GLchar) * infologlen);
glGetShaderInfoLog(shader, infologlen, NULL, infolog);
printf("shader whoopsie!\n%s\n", infolog);
free(infolog);
}
}
return shader;
}
GLuint create_program () {
char * src = read_file("shaders/vertex.glsl");
const GLuint vertex_shader = create_shader(GL_VERTEX_SHADER, src);
free(src);
src = read_file("shaders/fragment.glsl");
const GLuint fragment_shader = create_shader(GL_FRAGMENT_SHADER, src);
free(src);
const GLuint program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
GLint linked;
glGetProgramiv(program, GL_LINK_STATUS, &linked);
if (linked == GL_FALSE) {
GLint infologlen; // null-term included
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infologlen);
if (infologlen != 0) {
GLchar * const infolog = malloc(sizeof(GLchar) * infologlen); // freed in glez_free()
glGetProgramInfoLog(program, infologlen, NULL, infolog);
printf("program whoopsie!\n%s\n", infolog);
free(infolog);
}
}
}
```