Madolite

Untitled

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