Shader.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <fstream>
  2. #include <cstring>
  3. #include "client/rendering/Shader.h"
  4. #include "client/Utils.h"
  5. Shader::Shader(const GLchar* vPath, const GLchar* fPath) : valid(false),
  6. vShader(0), fShader(0), program(0)
  7. {
  8. std::vector<GLchar> vCode;
  9. std::vector<GLchar> fCode;
  10. bool vCheck = readFile(vCode, vPath);
  11. bool fCheck = readFile(fCode, fPath);
  12. if(vCheck || fCheck)
  13. {
  14. return;
  15. }
  16. vCheck = compileShader(vShader, vCode.data(), GL_VERTEX_SHADER);
  17. fCheck = compileShader(fShader, fCode.data(), GL_FRAGMENT_SHADER);
  18. if(vCheck || fCheck)
  19. {
  20. return;
  21. }
  22. program = glCreateProgram();
  23. glAttachShader(program, vShader);
  24. glAttachShader(program, fShader);
  25. glLinkProgram(program);
  26. if(checkAndPrintError("shader linking error"))
  27. {
  28. return;
  29. }
  30. GLint linked;
  31. glGetProgramiv(program, GL_LINK_STATUS, &linked);
  32. if(linked == GL_FALSE)
  33. {
  34. GLchar buffer[512];
  35. glGetProgramInfoLog(program, 512, nullptr, buffer);
  36. std::cout << "programm linking info log: " << buffer << "\n";
  37. return;
  38. }
  39. valid = true;
  40. }
  41. Shader::~Shader()
  42. {
  43. glDeleteProgram(program);
  44. glDeleteShader(vShader);
  45. glDeleteShader(fShader);
  46. }
  47. bool Shader::isValid() const
  48. {
  49. return valid;
  50. }
  51. bool Shader::readFile(std::vector<GLchar>& buffer, const GLchar* path) const
  52. {
  53. std::ifstream in;
  54. in.open(path);
  55. if(in.fail())
  56. {
  57. std::cout << "cannot read shader file: '" << path << "'\n";
  58. return true;
  59. }
  60. while(true)
  61. {
  62. GLchar c = in.get();
  63. if(in.eof())
  64. {
  65. break;
  66. }
  67. buffer.push_back(c);
  68. }
  69. buffer.push_back('\0');
  70. return false;
  71. }
  72. bool Shader::compileShader(GLuint& shader, const GLchar* code, GLenum shaderType) const
  73. {
  74. shader = glCreateShader(shaderType);
  75. glShaderSource(shader, 1, &code, nullptr);
  76. glCompileShader(shader);
  77. if(checkAndPrintError("shader error"))
  78. {
  79. return true;
  80. }
  81. GLint compiled;
  82. glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
  83. if(compiled == GL_FALSE)
  84. {
  85. GLchar buffer[512];
  86. glGetShaderInfoLog(shader, 512, nullptr, buffer);
  87. std::cout << "shader info log: " << buffer << "\n";
  88. return true;
  89. }
  90. return false;
  91. }
  92. void Shader::use() const
  93. {
  94. glUseProgram(program);
  95. }
  96. void Shader::setMatrix(const GLchar* name, const float* data) const
  97. {
  98. glUniformMatrix4fv(glGetUniformLocation(program, name), 1, GL_FALSE, data);
  99. }
  100. void Shader::setInt(const GLchar* name, GLint data) const
  101. {
  102. glUniform1i(glGetUniformLocation(program, name), data);
  103. }