Advertisement
Guest User

OpenGLDemoShader

a guest
Nov 27th, 2015
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include<fstream>
  2. #include<iostream>
  3.  
  4. #include "shader.h"
  5.  
  6.  
  7. void Shader::Bind()
  8. {
  9.     glUseProgram(m_program);
  10. }
  11.  
  12. GLuint Shader::CreateShader(const std::string& text,GLenum shaderType)
  13. {
  14.     GLuint shader = glCreateShader(shaderType);
  15.     if(shader == 0)
  16.         std::cerr << "Error : Shader creation failed" << std::endl;
  17.  
  18.     const GLchar* shaderSourceStrings[1];
  19.     GLint shaderSourceStringLengths[1];
  20.  
  21.     shaderSourceStrings[0] = text.c_str();
  22.     shaderSourceStringLengths[0] = text.length();
  23.  
  24.     glShaderSource(shader, 1, shaderSourceStrings,shaderSourceStringLengths);
  25.     glCompileShader(shader);
  26.  
  27.     CheckShaderError(shader, GL_COMPILE_STATUS, false,"Shader Compilation Failed");
  28.  
  29.     return shader;
  30. }
  31.  
  32. std::string Shader::LoadShader(const std::string& fileName)
  33. {
  34.     std::ifstream file;
  35.     file.open((fileName).c_str());
  36.  
  37.     std::string output;
  38.     std::string line;
  39.  
  40.     if(file.is_open())
  41.     {
  42.         while(file.good())
  43.         {
  44.             getline(file, line);
  45.             output.append(line + "\n");
  46.         }
  47.     }
  48.     else
  49.     {
  50.         std::cerr << "Unable to load shader: " << fileName << std::endl;
  51.     }
  52.  
  53.     return output;
  54. }
  55.  
  56. void Shader::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage)
  57. {
  58.     GLint success = 0;
  59.     GLchar error[1024] = { 0 };
  60.  
  61.     if(isProgram)
  62.         glGetProgramiv(shader, flag, &success);
  63.     else
  64.         glGetShaderiv(shader, flag, &success);
  65.  
  66.     if(success == GL_FALSE)
  67.     {
  68.         if(isProgram)
  69.             glGetProgramInfoLog(shader, sizeof(error), NULL, error);
  70.         else
  71.             glGetShaderInfoLog(shader, sizeof(error), NULL, error);
  72.  
  73.         std::cerr << errorMessage << ": '" << error << "'" << std::endl;
  74.     }
  75. }
  76.  
  77.  
  78. Shader::Shader(const std::string& fileName)
  79. {
  80.     m_program = glCreateProgram();
  81.     m_shaders[0] = CreateShader(LoadShader(fileName + ".vs"),GL_VERTEX_SHADER);
  82.     m_shaders[1] = CreateShader(LoadShader(fileName + ".fs"),GL_FRAGMENT_SHADER);
  83.  
  84.     for(unsigned int i=0;i<NUM_SHADERS; i++)
  85.         glAttachShader(m_program,m_shaders[i]);
  86.  
  87.     //glBindAttribLocation(m_program, 0, "position");
  88.  
  89.     glLinkProgram(m_program);
  90.     CheckShaderError(m_program, GL_LINK_STATUS, true,"Program Linking Failed");
  91.  
  92.     glValidateProgram(m_program);
  93.     CheckShaderError(m_program, GL_VALIDATE_STATUS, true,"Program Validation Failed");
  94.  
  95. }
  96.  
  97. Shader::~Shader()
  98. {
  99.     for(unsigned int i=0;i<NUM_SHADERS; i++)
  100.     {
  101.         glDetachShader(m_program,m_shaders[i]);
  102.         glDeleteShader(m_shaders[i]);
  103.     }
  104.  
  105.     glDeleteProgram(m_program);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement