Shader.cpp 2.7 KB

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