shader.c (2027B)
1 #include "minecraft.h" 2 3 unsigned int Shader; 4 5 static char *read_file(const char *path) { 6 FILE *f = fopen(path, "rb"); 7 if (!f) { perror(path); exit(EXIT_FAILURE); } 8 fseek(f, 0, SEEK_END); 9 long len = ftell(f); 10 fseek(f, 0, SEEK_SET); 11 char *buf = malloc(len + 1); 12 if (!buf) { fclose(f); exit(EXIT_FAILURE); } 13 fread(buf, 1, len, f); 14 buf[len] = '\0'; 15 fclose(f); 16 return buf; 17 } 18 19 const char *vert_shader_src; 20 const char *frag_shader_src; 21 22 static void load_shaders() { 23 static char *vert_buf = NULL; 24 static char *frag_buf = NULL; 25 vert_buf = read_file("vertex.glsl"); 26 frag_buf = read_file("fragment.glsl"); 27 vert_shader_src = vert_buf; 28 frag_shader_src = frag_buf; 29 } 30 31 void shader_init() { 32 load_shaders(); 33 34 unsigned int vert_shader = glCreateShader(GL_VERTEX_SHADER); 35 glShaderSource(vert_shader, 1, &vert_shader_src, NULL); 36 glCompileShader(vert_shader); 37 38 /* check for shader compile errors */ 39 int success; 40 char info[512]; 41 glGetShaderiv(vert_shader, GL_COMPILE_STATUS, &success); 42 if (!success) { 43 glGetShaderInfoLog(vert_shader, 512, NULL, info); 44 printf("err: vertex shader failed: %s\n", info); 45 } 46 /* fragment shader */ 47 unsigned int frag_shader = glCreateShader(GL_FRAGMENT_SHADER); 48 glShaderSource(frag_shader, 1, &frag_shader_src, NULL); 49 glCompileShader(frag_shader); 50 51 /* check for shader compile errors */ 52 glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &success); 53 if (!success) { 54 glGetShaderInfoLog(frag_shader, 512, NULL, info); 55 printf("err: fragment shader failed: %s\n", info); 56 } 57 58 /* link shaders */ 59 Shader = glCreateProgram(); 60 glAttachShader(Shader, vert_shader); 61 glAttachShader(Shader, frag_shader); 62 glLinkProgram(Shader); 63 64 /* check for linking errors */ 65 glGetProgramiv(Shader, GL_LINK_STATUS, &success); 66 if (!success) { 67 glGetProgramInfoLog(Shader, 512, NULL, info); 68 printf("err: linking failed: %s\n", info); 69 } 70 glDeleteShader(vert_shader); 71 glDeleteShader(frag_shader); 72 } 73 74 void shader_end() { 75 glDeleteProgram(Shader); 76 }