Advertisement
acampbellblack

Untitled

Jan 22nd, 2024
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include "shader.h"
  2.  
  3. #include <glad/glad.h>
  4. #include <glm/glm.hpp>
  5. #include <glm/gtc/type_ptr.hpp>
  6.  
  7. #include <string>
  8. #include <fstream>
  9. #include <sstream>
  10. #include <iostream>
  11.  
  12. Shader::Shader(const char* vertex_path, const char* fragment_path)
  13. {
  14.     // 1. retrieve the vertex/fragment source code from filePath
  15.     std::string vertex_code;
  16.     std::string fragment_code;
  17.     std::ifstream vertex_shader_file;
  18.     std::ifstream fragment_shader_file;
  19.     // ensure ifstream objects can throw exceptions:
  20.     vertex_shader_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  21.     fragment_shader_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  22.     try {
  23.         // open files
  24.         vertex_shader_file.open(vertex_path);
  25.         fragment_shader_file.open(fragment_path);
  26.         std::stringstream vertex_shader_stream;
  27.         std::stringstream fragment_shader_stream;
  28.         // read file's buffer contents into streams
  29.         vertex_shader_stream << vertex_shader_file.rdbuf();
  30.         fragment_shader_stream << fragment_shader_file.rdbuf();
  31.         // close file handlers
  32.         vertex_shader_file.close();
  33.         fragment_shader_file.close();
  34.         // convert stream into string
  35.         vertex_code = vertex_shader_stream.str();
  36.         fragment_code = fragment_shader_stream.str();
  37.     } catch (std::ifstream::failure e) {
  38.         std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
  39.     }
  40.     const char* vertex_shader_code = vertex_code.c_str();
  41.     const char* fragment_shader_code = fragment_code.c_str();
  42.  
  43.     // 2. compile shaders
  44.     unsigned int vertex, fragment;
  45.     int success;
  46.     char infoLog[512];
  47.  
  48.     // vertex Shader
  49.     vertex = glCreateShader(GL_VERTEX_SHADER);
  50.     glShaderSource(vertex, 1, &vertex_shader_code, NULL);
  51.     glCompileShader(vertex);
  52.     // print compile errors if any
  53.     glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
  54.     if (!success) {
  55.         glGetShaderInfoLog(vertex, 512, NULL, infoLog);
  56.         std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  57.     };
  58.  
  59.     // similiar for Fragment Shader
  60.     fragment = glCreateShader(GL_FRAGMENT_SHADER);
  61.     glShaderSource(fragment, 1, &fragment_shader_code, NULL);
  62.     glCompileShader(fragment);
  63.     // print compile errors if any
  64.     glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
  65.     if (!success) {
  66.         glGetShaderInfoLog(vertex, 512, NULL, infoLog);
  67.         std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  68.     };
  69.  
  70.     // shader Program
  71.     m_id = glCreateProgram();
  72.     glAttachShader(m_id, vertex);
  73.     glAttachShader(m_id, fragment);
  74.     glLinkProgram(m_id);
  75.     // print linking errors if any
  76.     glGetProgramiv(m_id, GL_LINK_STATUS, &success);
  77.     if (!success) {
  78.         glGetProgramInfoLog(m_id, 512, NULL, infoLog);
  79.         std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  80.     }
  81.  
  82.     // delete the shaders as they're linked into our program now and no longer necessary
  83.     glDeleteShader(vertex);
  84.     glDeleteShader(fragment);
  85. }
  86.  
  87. void Shader::use()
  88. {
  89.     glUseProgram(m_id);
  90. }
  91.  
  92. void Shader::set_bool(const std::string& name, bool value) const
  93. {
  94.     glUniform1i(glGetUniformLocation(m_id, name.c_str()), (int)value);
  95. }
  96.  
  97. void Shader::set_int(const std::string& name, int value) const
  98. {
  99.     glUniform1i(glGetUniformLocation(m_id, name.c_str()), value);
  100. }
  101.  
  102. void Shader::set_float(const std::string& name, float value) const
  103. {
  104.     glUniform1f(glGetUniformLocation(m_id, name.c_str()), value);
  105. }
  106.  
  107. void Shader::set_mat4(const std::string& name, glm::mat4 value) const
  108. {
  109.     glUniformMatrix4fv(glGetUniformLocation(m_id, name.c_str()), 1, GL_FALSE, glm::value_ptr(value));
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement