Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "shader.h"
- #include <glad/glad.h>
- #include <glm/glm.hpp>
- #include <glm/gtc/type_ptr.hpp>
- #include <string>
- #include <fstream>
- #include <sstream>
- #include <iostream>
- Shader::Shader(const char* vertex_path, const char* fragment_path)
- {
- // 1. retrieve the vertex/fragment source code from filePath
- std::string vertex_code;
- std::string fragment_code;
- std::ifstream vertex_shader_file;
- std::ifstream fragment_shader_file;
- // ensure ifstream objects can throw exceptions:
- vertex_shader_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
- fragment_shader_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
- try {
- // open files
- vertex_shader_file.open(vertex_path);
- fragment_shader_file.open(fragment_path);
- std::stringstream vertex_shader_stream;
- std::stringstream fragment_shader_stream;
- // read file's buffer contents into streams
- vertex_shader_stream << vertex_shader_file.rdbuf();
- fragment_shader_stream << fragment_shader_file.rdbuf();
- // close file handlers
- vertex_shader_file.close();
- fragment_shader_file.close();
- // convert stream into string
- vertex_code = vertex_shader_stream.str();
- fragment_code = fragment_shader_stream.str();
- } catch (std::ifstream::failure e) {
- std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
- }
- const char* vertex_shader_code = vertex_code.c_str();
- const char* fragment_shader_code = fragment_code.c_str();
- // 2. compile shaders
- unsigned int vertex, fragment;
- int success;
- char infoLog[512];
- // vertex Shader
- vertex = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertex, 1, &vertex_shader_code, NULL);
- glCompileShader(vertex);
- // print compile errors if any
- glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
- if (!success) {
- glGetShaderInfoLog(vertex, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
- };
- // similiar for Fragment Shader
- fragment = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragment, 1, &fragment_shader_code, NULL);
- glCompileShader(fragment);
- // print compile errors if any
- glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
- if (!success) {
- glGetShaderInfoLog(vertex, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
- };
- // shader Program
- m_id = glCreateProgram();
- glAttachShader(m_id, vertex);
- glAttachShader(m_id, fragment);
- glLinkProgram(m_id);
- // print linking errors if any
- glGetProgramiv(m_id, GL_LINK_STATUS, &success);
- if (!success) {
- glGetProgramInfoLog(m_id, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
- }
- // delete the shaders as they're linked into our program now and no longer necessary
- glDeleteShader(vertex);
- glDeleteShader(fragment);
- }
- void Shader::use()
- {
- glUseProgram(m_id);
- }
- void Shader::set_bool(const std::string& name, bool value) const
- {
- glUniform1i(glGetUniformLocation(m_id, name.c_str()), (int)value);
- }
- void Shader::set_int(const std::string& name, int value) const
- {
- glUniform1i(glGetUniformLocation(m_id, name.c_str()), value);
- }
- void Shader::set_float(const std::string& name, float value) const
- {
- glUniform1f(glGetUniformLocation(m_id, name.c_str()), value);
- }
- void Shader::set_mat4(const std::string& name, glm::mat4 value) const
- {
- glUniformMatrix4fv(glGetUniformLocation(m_id, name.c_str()), 1, GL_FALSE, glm::value_ptr(value));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement