Advertisement
r57shell

OpenGL shader compilation

May 6th, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. GLint CompileShader(GLuint shader, LPCSTR path)
  2. {
  3.     FILE *f = fopen(path, "rb");
  4.     if (!f)
  5.         return GL_FALSE;
  6.  
  7.     fseek(f,0,SEEK_END);
  8.     GLint len = ftell(f);
  9.     fseek(f,0,SEEK_SET);
  10.  
  11.     GLchar *data = (GLchar*)malloc(len);
  12.     if (!data)
  13.     {
  14.         fclose(f);
  15.         return GL_FALSE;
  16.     }
  17.  
  18.     int readed = fread(data, 1, len, f);
  19.     fclose(f);
  20.     if (readed != len)
  21.     {
  22.         free(data);
  23.         return GL_FALSE;
  24.     }
  25.  
  26.     GLchar* strings[1];
  27.     strings[0] = data;
  28.     glShaderSource(shader, 1, (const GLchar**)strings, &len);
  29.     free(data);
  30.  
  31.     glCompileShader(shader);
  32.  
  33.     GLint success = 0;
  34.     glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
  35.     return success;
  36. }
  37.  
  38. void PrintShaderLog(GLuint shader, LPCSTR path)
  39. {
  40.     GLint logSize = 0;
  41.     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logSize);
  42.  
  43.     GLchar *infoLog = (GLchar*)malloc(logSize);
  44.     if (!infoLog)
  45.         return;
  46.  
  47.     GLsizei len;
  48.     glGetShaderInfoLog(shader, logSize, &len, infoLog);
  49.  
  50.     FILE *log = fopen(path, "wb");
  51.     if (log)
  52.     {
  53.         fwrite(infoLog, 1, len, log);
  54.         fclose(log);
  55.     }
  56.  
  57.     free(infoLog);
  58. }
  59.  
  60. GLint CompileProgram(GLuint program, GLuint vertex, GLuint fragment)
  61. {
  62.     glAttachShader(program, vertex);
  63.     glAttachShader(program, fragment);
  64.  
  65.     glLinkProgram(program);
  66.  
  67.     GLint success = 0;
  68.     glGetProgramiv(program, GL_LINK_STATUS, &success);
  69.  
  70.     return success;
  71. }
  72.  
  73. void PrintProgramLog(GLuint shader, LPCSTR path)
  74. {
  75.     GLint logSize = 0;
  76.     glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &logSize);
  77.  
  78.     GLchar *infoLog = (GLchar*)malloc(logSize);
  79.     if (!infoLog)
  80.         return;
  81.  
  82.     GLsizei len = 0;
  83.     glGetProgramInfoLog(shader, logSize, &len, infoLog);
  84.  
  85.     FILE *log = fopen(path, "wb");
  86.     if (log)
  87.     {
  88.         fwrite(infoLog, 1, len, log);
  89.         fclose(log);
  90.     }
  91.  
  92.     free(infoLog);
  93. }
  94.  
  95. GLuint MakeProgram(LPCSTR vert_path, LPCSTR frag_path)
  96. {
  97.     GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
  98.     GLint res = CompileShader(vertex, vert_path);
  99.     PrintShaderLog(vertex, "vert.log");
  100.     if (res == GL_FALSE)
  101.     {
  102.         glDeleteShader(vertex);
  103.         return res;
  104.     }
  105.  
  106.     GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
  107.     res = CompileShader(fragment, frag_path);
  108.     PrintShaderLog(fragment, "frag.log");
  109.     if (res == GL_FALSE)
  110.     {
  111.         glDeleteShader(vertex);
  112.         glDeleteShader(fragment);
  113.         return res;
  114.     }
  115.  
  116.     GLuint program = glCreateProgram();
  117.     res = CompileProgram(program, vertex, fragment);
  118.     PrintProgramLog(program, "prog.log");
  119.  
  120.     glDetachShader(program, vertex);
  121.     glDetachShader(program, fragment);
  122.  
  123.     glDeleteShader(vertex);
  124.     glDeleteShader(fragment);
  125.  
  126.     return program;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement