Skip to content

Instantly share code, notes, and snippets.

@acdimalev
Created September 13, 2012 14:38
Show Gist options
  • Save acdimalev/3714711 to your computer and use it in GitHub Desktop.
Save acdimalev/3714711 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include "shader.h"
// http://en.wikipedia.org/wiki/Vertex_Buffer_Object#Example_usage_in_C_Using_OpenGL_3.x_and_OpenGL_4.x
char* file2buf(char *file) {
FILE *fptr;
long length;
char *buf;
fptr = fopen(file, "r");
if (!fptr) { return NULL; }
fseek(fptr, 0, SEEK_END);
length = ftell(fptr);
buf = malloc(length+1);
fseek(fptr, 0, SEEK_SET);
fread(buf, length, 1, fptr);
fclose(fptr);
buf[length] = 0;
return buf;
}
void dump_shader_info_log(GLuint shader) {
int info_log_len;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_len);
if (info_log_len > 0) {
// GetShaderInfoLog always reads from the beginning
// need to allocate a buffer large enough for the whole message
char *buffer = malloc(info_log_len);
if (buffer) {
glGetShaderInfoLog(shader, info_log_len, NULL, (GLchar *)buffer);
fprintf(stderr, "%s", buffer);
free(buffer);
}
}
}
void dump_program_info_log(GLuint program) {
int info_log_len;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_len);
if (info_log_len > 0) {
// assuming that GetProgramInfoLog also always reads from the beginning
// allocating a buffer large enough for the whole message
char *buffer = malloc(info_log_len);
if (buffer) {
glGetProgramInfoLog(program, info_log_len, NULL, (GLchar *)buffer);
fprintf(stderr, "%s", buffer);
free(buffer);
}
}
}
GLuint load_shader(GLuint program, GLenum type, char *file) {
GLuint shader = glCreateShader(type);
char *src = file2buf(file);
int success = 0;
fprintf(stderr, "loading shader from \"%s\"...\n", file);
if ( (shader != 0) & (src != NULL) ) {
glShaderSource(shader, 1, (const GLchar **)&src, NULL);
glCompileShader(shader);
int compiled;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if (compiled) {
glAttachShader(program, shader);
success = -1;
}
dump_shader_info_log(shader);
}
free(src);
glDeleteShader(shader);
if (success) { return shader; }
else { return 0; }
}
int link_program(GLuint program) {
int success = 0;
glLinkProgram(program);
int is_linked;
glGetProgramiv(program, GL_LINK_STATUS, &is_linked);
if (is_linked) { success = -1; }
dump_program_info_log(program);
if (success) { return 0; }
else { return -1; }
}
GLuint load_shader(GLuint program, GLenum type, char *file);
int link_program(GLuint program);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment