Created
September 13, 2012 14:38
-
-
Save acdimalev/3714711 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; } | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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