minecraft

minecraft
git clone git://git.evenfri.pw/minecraft.git
Log | Files | Refs | README

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 }