#include "M_shader.h" unsigned int M_loadShader(const char* filename, unsigned int shadertype) { void* shader_source = SDL_LoadFile(filename, NULL); unsigned int shader = glCreateShader(shadertype); glShaderSource(shader, 1, (const char**)&shader_source, NULL); glCompileShader(shader); SDL_free(shader_source); int success; glGetShaderiv(shader, GL_COMPILE_STATUS, &success); if (!success) { printf("Couldn't compile shader\n"); return 0; } return shader; } M_ShaderProgram M_createShaderProgram(const char *vertex_shader_file, const char* fragment_shader_file) { unsigned int vertex_shader = M_loadShader(vertex_shader_file, GL_VERTEX_SHADER); unsigned int fragment_shader = M_loadShader(fragment_shader_file, GL_FRAGMENT_SHADER); return M_compileShaderProgram(vertex_shader, fragment_shader); } M_ShaderProgram M_compileShaderProgram(unsigned int vertex_shader, unsigned int fragment_shader) { M_ShaderProgram shader_program; shader_program.prog = glCreateProgram(); glAttachShader(shader_program.prog, vertex_shader); glAttachShader(shader_program.prog, fragment_shader); glLinkProgram(shader_program.prog); shader_program.vertex_shader = vertex_shader; shader_program.fragment_shader = fragment_shader; int success; glGetProgramiv(shader_program.prog, GL_LINK_STATUS, &success); if (!success) { printf("Couldn't link shader program\n"); } shader_program.transform_loc = glGetUniformLocation(shader_program.prog, "model"); shader_program.view_loc = glGetUniformLocation(shader_program.prog, "view"); shader_program.projection_loc = glGetUniformLocation(shader_program.prog, "projection"); return shader_program; } void M_killShaderProgram(M_ShaderProgram *shader_program) { glDeleteShader(shader_program->vertex_shader); glDeleteShader(shader_program->fragment_shader); }