Skip to content

Instantly share code, notes, and snippets.

@acdimalev
Last active October 10, 2015 16:27
Show Gist options
  • Save acdimalev/3718448 to your computer and use it in GitHub Desktop.
Save acdimalev/3718448 to your computer and use it in GitHub Desktop.
GLSL shortcuts
#include GL
#include "glsl.h"
void glsl_setup(glsl_program *program) {
int gl_program = program->gl_program = glCreateProgram();
int i;
for (i = 0; i < program->n_shaders; i++) {
glsl_shader *shader = &program->shaders[i];
int gl_shader = glCreateShader(shader->type);
glShaderSource(gl_shader, 1, &shader->source, 0);
glCompileShader(gl_shader);
//char buffer[256];
//glGetShaderInfoLog(gl_shader, sizeof(buffer), 0, buffer);
//printf("%s\n", buffer);
glAttachShader(gl_program, gl_shader);
glDeleteShader(gl_shader);
}
for (i = 0; i < program->n_attribs; i++) {
glsl_attrib *attrib = &program->attribs[i];
glBindAttribLocation(gl_program, i, attrib->symbol);
}
glLinkProgram(gl_program);
for (i = 0; i < program->n_uniforms; i++) {
glsl_uniform *uniform = &program->uniforms[i];
uniform->location = glGetUniformLocation(gl_program, uniform->symbol);
}
glGenBuffers(1, &program->vbo);
glBindBuffer(GL_ARRAY_BUFFER, program->vbo);
glBufferData(GL_ARRAY_BUFFER,
program->vb_n_elements * program->stride * sizeof(GLfloat),
program->vb, program->vbo_hint);
glGenBuffers(1, &program->ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, program->ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
program->ib_n_elements * sizeof(GLushort),
program->ib, program->ibo_hint);
}
void glsl_subdata_vb(glsl_program *program) {
glBindBuffer(GL_ARRAY_BUFFER, program->vbo);
glBufferSubData(GL_ARRAY_BUFFER,
0, program->vb_n_elements * program->stride * sizeof(GLfloat),
program->vb);
}
void glsl_subdata_ib(glsl_program *program) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, program->ibo);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
0, program->ib_n_elements * sizeof(GLushort),
program->ib);
}
void glsl_render(glsl_program *program) {
int i;
glBindBuffer(GL_ARRAY_BUFFER, program->vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, program->ibo);
for (i = 0; i < program->n_attribs; i++) {
glsl_attrib *attrib = &program->attribs[i];
const GLvoid *pointer = (GLvoid *)(attrib->offset * sizeof(GLfloat));
glEnableVertexAttribArray(i);
glVertexAttribPointer(i, attrib->count, GL_FLOAT, GL_FALSE,
program->stride * sizeof(GLfloat), pointer);
}
glDrawElements(GL_TRIANGLES, program->ib_n_elements, GL_UNSIGNED_SHORT, 0);
for (i = 0; i < program->n_attribs; i++) {
glDisableVertexAttribArray(i);
}
}
typedef struct {
int type;
const char *source;
} glsl_shader;
typedef struct {
int offset;
int count;
char *symbol;
} glsl_attrib;
typedef struct {
int location;
char *symbol;
} glsl_uniform;
typedef struct {
int gl_program;
int stride;
int n_shaders;
glsl_shader *shaders;
int n_attribs;
glsl_attrib *attribs;
int n_uniforms;
glsl_uniform *uniforms;
unsigned int vbo;
int vb_n_elements;
float *vb;
int vbo_hint;
unsigned int ibo;
int ib_n_elements;
unsigned short *ib;
int ibo_hint;
} glsl_program;
void glsl_setup(glsl_program *program);
void glsl_subdata_ib(glsl_program *program);
void glsl_subdata_vb(glsl_program *program);
void glsl_render(glsl_program *program);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment