Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include "shader.h"
  2. #include "debug.h"
  3. #include <fstream>
  4. #include <sstream>
  5. #include <stdexcept>
  6.  
  7. #include <iostream>
  8.  
  9. namespace {
  10.     std::string loadFileContents(const char* path)
  11.     {
  12.         std::ifstream inFile(path);
  13.         if (!inFile.is_open()) {
  14.             std::cout << "Could not open file " << path << std::endl;
  15.             return "";
  16.         }
  17.         std::stringstream stream;
  18.         stream << inFile.rdbuf();
  19.         return stream.str();
  20.     }
  21.  
  22.     GLuint compileShader(const std::string_view source, GLenum shaderType)
  23.     {
  24.         auto shaderID = glCheck(glCreateShader(shaderType));
  25.  
  26.         const GLchar* const shaderSourcePtr = source.data();
  27.         const GLint shaderSourceLength = source.length();
  28.         glCheck(glShaderSource(shaderID, 1, &shaderSourcePtr, &shaderSourceLength));
  29.         glCheck(glCompileShader(shaderID));
  30.  
  31.         GLint logLength;
  32.         glCheck(glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLength));
  33.         if (logLength) {
  34.             std::string infoLog(logLength, 0);
  35.             glCheck(glGetShaderInfoLog(shaderID, logLength, nullptr, infoLog.data()));
  36.  
  37.             throw std::runtime_error(infoLog);
  38.         }
  39.  
  40.         return shaderID;
  41.     }
  42.  
  43.     GLuint linkProgram(GLuint vertexShaderID, GLuint fragmentShaderID)
  44.     {
  45.         auto id = glCheck(glCreateProgram());
  46.  
  47.         glCheck(glAttachShader(id, vertexShaderID));
  48.         glCheck(glAttachShader(id, fragmentShaderID));
  49.  
  50.         glCheck(glLinkProgram(id));
  51.  
  52.         glCheck(glDetachShader(id, fragmentShaderID));
  53.         glCheck(glDetachShader(id, vertexShaderID));
  54.  
  55.         GLint logLength;
  56.         glCheck(glGetProgramiv(id, GL_INFO_LOG_LENGTH, &logLength));
  57.         if (logLength) {
  58.             std::string infoLog(logLength, 0);
  59.             glCheck(glGetProgramInfoLog(id, logLength, nullptr, infoLog.data()));
  60.             throw std::runtime_error(infoLog);
  61.         }
  62.  
  63.         return id;
  64.     }
  65. } // namespace
  66.  
  67. namespace mus {
  68.     Shader createShader(const char* vertexShaderFile, const char* fragmentShaderFile)
  69.     {
  70.         Shader shader;
  71.         std::string vertexShader = loadFileContents(vertexShaderFile);
  72.         std::string fragmentShader = loadFileContents(fragmentShaderFile);
  73.  
  74.         GLuint vertexProgram = compileShader(vertexShader, GL_VERTEX_SHADER);
  75.         GLuint fragmentProgram = compileShader(fragmentShader, GL_FRAGMENT_SHADER);
  76.  
  77.         shader.program = linkProgram(vertexProgram, fragmentProgram);
  78.  
  79.         glCheck(glDetachShader(shader.program, vertexProgram));
  80.         glCheck(glDetachShader(shader.program, fragmentProgram));
  81.  
  82.         glCheck(glDeleteShader(vertexProgram));
  83.         glCheck(glDeleteShader(fragmentProgram));
  84.  
  85.         return shader;
  86.     }
  87. } // namespace mus
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement