.. _program_listing_file_gui_Demeter_Renderer_Shader.cpp: Program Listing for File Shader.cpp =================================== |exhale_lsh| :ref:`Return to documentation for file ` (``gui/Demeter/Renderer/Shader.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include #include #include "Shader.hpp" #include "logging/Logger.hpp" bool Shader::Init(const std::string &path) { std::ifstream file(path); if (!file) { Log::failed << "Failed to open shader file: " << path; return false; } std::string data( (std::istreambuf_iterator(file)), std::istreambuf_iterator()); const char *src = data.c_str(); file.close(); _shader = glCreateShader(_type); glShaderSource(_shader, 1, &src, nullptr); glCompileShader(_shader); GLint success; glGetShaderiv(_shader, GL_COMPILE_STATUS, &success); if (!success) { std::array log; glGetShaderInfoLog(_shader, log.size(), nullptr, log.data()); Log::failed << "Shader Compile Error: " << log.data(); return false; } return true; } Shader::~Shader() { glDeleteShader(_shader); } bool ShaderProgram::Init( std::unique_ptr vertexShader, std::unique_ptr fragmentShader) { vs = std::move(vertexShader); fs = std::move(fragmentShader); program = glCreateProgram(); glAttachShader(program, vs->Get()); glAttachShader(program, fs->Get()); glLinkProgram(program); GLint success = 0; glGetProgramiv(program, GL_LINK_STATUS, &success); if (!success) { std::array log; glGetProgramInfoLog(program, log.size(), nullptr, log.data()); Log::failed << "Shader Program Link Error: " << log.data(); return false; } return true; } ShaderProgram::~ShaderProgram() { glDeleteProgram(program); }