Advertisement
Guest User

engine_shaders.hpp

a guest
Mar 16th, 2014
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 KB | None | 0 0
  1. #ifndef ENGINE_SHADERS_HPP
  2. #define ENGINE_SHADERS_HPP
  3. #include <glm/glm.hpp>
  4. #include <GL/glew.h>
  5. #include <GLFW/glfw3.h>
  6. #include <GL/gl.h>
  7.  
  8. #include <thread>
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <assert.h>
  16. #include <fstream>
  17.  
  18. /*GL SPECIFIC DEBUG START*/
  19. void PrintGLError(GLenum error){
  20.     switch(error){
  21.     case GL_NO_ERROR:
  22.         break;
  23.  
  24.     case GL_INVALID_ENUM:
  25.         std::cout << "GL_INVALID_ENUM \n";
  26.         break;
  27.  
  28.     case GL_INVALID_OPERATION:
  29.         std::cout << "GL_INVALID_OPERATION \n";
  30.         break;
  31.  
  32.     case GL_INVALID_FRAMEBUFFER_OPERATION:
  33.         std::cout << "GL_INVALID_FRAMEBUFFER_OPERATION \n";
  34.         break;
  35.  
  36.     case GL_OUT_OF_MEMORY:
  37.         std::cout << "GL_OUT_OF_MEMORY \n";
  38.         break;
  39.  
  40.     case GL_STACK_UNDERFLOW:
  41.         std::cout << "GL_STACK_UNDERFLOW \n";
  42.         break;
  43.  
  44.     case GL_STACK_OVERFLOW:
  45.         std::cout << "GL_STACK_OVERFLOW \n";
  46.         break;
  47.  
  48.     case GL_INVALID_VALUE:
  49.         std::cout << "GL_INVALID_VALUE:" << error << "\n";
  50.         break;
  51.  
  52.     default:
  53.         std::cout << "UNKOWN ERROR CODE: " << error << "\n";
  54.         break;
  55.     }
  56. }
  57.  
  58. void CheckForGLErrors(std::string function, int line){
  59.     GLenum error = glGetError();
  60.     if(error != GL_NO_ERROR ){
  61.  
  62.         //Go through all the errors:
  63.         std::cout << "OpenGL error in " << function
  64.                 << " (at line "<< line << ")" << ": \n";
  65.  
  66.         PrintGLError(error);
  67.  
  68.         error= glGetError();
  69.     }
  70. }
  71. /*GL SPECIFIC DEBUG END*/
  72.  
  73. GLuint CreateShader(GLenum shadertype, const std::string shaderfile){
  74.     GLuint shader = glCreateShader(shadertype);
  75.     std::string filedata;
  76.     std::string line;
  77.     const char* shaderdata;
  78.  
  79.     std::ifstream file (shaderfile);
  80.  
  81.     //Load file into a string
  82.     if(file.is_open()){
  83.             while(getline(file, line)){
  84.                 filedata.append(line);
  85.                 filedata.append("\n");
  86.             }
  87.     }
  88.     shaderdata = filedata.c_str();
  89.  
  90.     //Tell OpenGL where to find the shader data
  91.     glShaderSource(shader, 1, &shaderdata, NULL);
  92.  
  93.     //Compile the shader
  94.     glCompileShader(shader);
  95.  
  96.     //Check for errors
  97.     GLint status;
  98.     glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  99.     if( status == GL_FALSE){
  100.         std::string type;
  101.         switch(shadertype){
  102.         case GL_VERTEX_SHADER: type = "vertex"; break;
  103.         case GL_GEOMETRY_SHADER: type = "geometry"; break;
  104.         case GL_FRAGMENT_SHADER: type = "fragment"; break;
  105.         }
  106.  
  107.         std::cout << "OpenGL error in " << __func__
  108.                 << " (while compiling " << type << "shader):\n";
  109.         PrintGLError(status);
  110.  
  111.         GLint errorlegnth;
  112.         glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &errorlegnth);
  113.         GLchar programerror[errorlegnth + 1];
  114.         glGetShaderInfoLog(shader, errorlegnth, NULL, programerror);
  115.         std::cout << programerror;
  116.     }
  117.     return shader;
  118. }
  119.  
  120. GLuint CreateProgram(const std::vector<GLuint> &ShaderList){
  121.     GLuint program = glCreateProgram();
  122.  
  123.     //Attach all our shaders to the program
  124.     for(size_t i = 0; i < ShaderList.size(); i++){
  125.         glAttachShader(program, ShaderList[i]);
  126.     }
  127.  
  128.     //Link them
  129.     glLinkProgram(program);
  130.  
  131.     //Check for any problems
  132.     GLint status;
  133.     glGetProgramiv(program, GL_LINK_STATUS, &status);
  134.     if( status == GL_FALSE){
  135.         std::cout << "OpenGL error in " << __func__
  136.                 << " (at line " << __LINE__ << "):\n";
  137.         PrintGLError(status);
  138.  
  139.         GLint errorlegnth;
  140.         glGetProgramiv(program, GL_INFO_LOG_LENGTH, &errorlegnth);
  141.         GLchar programerror[errorlegnth + 1];
  142.         glGetProgramInfoLog(program, errorlegnth, NULL, programerror);
  143.         std::cout << programerror;
  144.     }
  145.  
  146.     //Detach all our shaders from the program
  147.     for(size_t i = 0; i < ShaderList.size(); i++){
  148.             glDetachShader(program, ShaderList[i]);
  149.     }
  150.  
  151.     return program;
  152. }
  153.  
  154. GLuint LoadShaders(std::string vertexshader, std::string fragmentshader){
  155.     std::vector<GLuint> ShaderList;
  156.  
  157.     ShaderList.push_back(CreateShader(GL_VERTEX_SHADER, vertexshader));
  158.     ShaderList.push_back(CreateShader(GL_FRAGMENT_SHADER, fragmentshader));
  159.  
  160.     GLuint Program = CreateProgram(ShaderList);
  161.  
  162.     for(uint i = 0; i < ShaderList.size(); ++i){
  163.         glDeleteShader(ShaderList[i]);
  164.     }
  165.  
  166.     return Program;
  167. }
  168.  
  169. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement