beefviper

Shader Class

Sep 7th, 2024 (edited)
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | Source Code | 0 0
  1. // shader.h
  2. // LearnOpenGL.com
  3. // author: beefviper
  4. // date: Sept 6, 2024
  5.  
  6. #pragma once
  7.  
  8. #include <glad/glad.h>
  9.  
  10. #include <string>
  11. #include <fstream>
  12. #include <sstream>
  13. #include <iostream>
  14.  
  15. class Shader
  16. {
  17. public:
  18.     unsigned int ID;
  19.  
  20.     Shader(const char* vertexPath, const char* fragmentPath);
  21.  
  22.  
  23.     void use() const;
  24.  
  25.     void setBool(const std::string& name, bool value) const;
  26.     void setInt(const std::string& name, int value) const;
  27.     void setFloat(const std::string& name, float value) const;
  28. };
  29.  
  30. Shader::Shader(const char* vertexPath, const char* fragmentPath)
  31. {
  32.     std::string vertexCode;
  33.     std::string fragmentCode;
  34.     std::ifstream vShaderFile;
  35.     std::ifstream fShaderFile;
  36.  
  37.     vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  38.     fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  39.  
  40.     try
  41.     {
  42.         vShaderFile.open(vertexPath);
  43.         fShaderFile.open(fragmentPath);
  44.  
  45.         std::stringstream vShaderStream;
  46.         std::stringstream fShaderStream;
  47.  
  48.         vShaderStream << vShaderFile.rdbuf();
  49.         fShaderStream << fShaderFile.rdbuf();
  50.  
  51.         vShaderFile.close();
  52.         fShaderFile.close();
  53.  
  54.         vertexCode = vShaderStream.str();
  55.         fragmentCode = fShaderStream.str();
  56.     }
  57.     catch (std::ifstream::failure e)
  58.     {
  59.         std::cout << "ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ" << std::endl;
  60.     }
  61.  
  62.     const char* vShaderCode = vertexCode.c_str();
  63.     const char* fShaderCode = fragmentCode.c_str();
  64.  
  65.     unsigned int vertex{};
  66.     unsigned int fragment{};
  67.     int success{};
  68.     char infoLog[512]{};
  69.  
  70.     vertex = glCreateShader(GL_VERTEX_SHADER);
  71.     glShaderSource(vertex, 1, &vShaderCode, NULL);
  72.     glCompileShader(vertex);
  73.  
  74.     glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
  75.     if (!success)
  76.     {
  77.         glGetShaderInfoLog(vertex, 512, NULL, infoLog);
  78.         std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  79.     }
  80.  
  81.     fragment = glCreateShader(GL_FRAGMENT_SHADER);
  82.     glShaderSource(fragment, 1, &fShaderCode, NULL);
  83.     glCompileShader(fragment);
  84.  
  85.     glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
  86.     if (!success)
  87.     {
  88.         glGetShaderInfoLog(fragment, 512, NULL, infoLog);
  89.         std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  90.     }
  91.  
  92.     ID = glCreateProgram();
  93.     glAttachShader(ID, vertex);
  94.     glAttachShader(ID, fragment);
  95.     glLinkProgram(ID);
  96.  
  97.     glGetProgramiv(ID, GL_LINK_STATUS, &success);
  98.     if (!success)
  99.     {
  100.         glGetProgramInfoLog(ID, 512, NULL, infoLog);
  101.         std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  102.     }
  103.  
  104.     glDeleteShader(vertex);
  105.     glDeleteShader(fragment);
  106. }
  107.  
  108. void Shader::use() const
  109. {
  110.     glUseProgram(ID);
  111. }
  112.  
  113. void Shader::setBool(const std::string& name, bool value) const
  114. {
  115.     glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
  116. }
  117. void Shader::setInt(const std::string& name, int value) const
  118. {
  119.     glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
  120. }
  121. void Shader::setFloat(const std::string& name, float value) const
  122. {
  123.     glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
  124. }
  125.  
Advertisement
Add Comment
Please, Sign In to add comment