diff options
Diffstat (limited to 'src/GFX/Shading')
| -rw-r--r-- | src/GFX/Shading/Program.cpp | 42 | ||||
| -rw-r--r-- | src/GFX/Shading/Program.hpp | 25 | ||||
| -rw-r--r-- | src/GFX/Shading/Shader.cpp | 24 | ||||
| -rw-r--r-- | src/GFX/Shading/Shader.hpp | 29 | ||||
| -rw-r--r-- | src/GFX/Shading/Uniform.cpp | 14 | ||||
| -rw-r--r-- | src/GFX/Shading/Uniform.hpp | 23 |
6 files changed, 157 insertions, 0 deletions
diff --git a/src/GFX/Shading/Program.cpp b/src/GFX/Shading/Program.cpp new file mode 100644 index 0000000..39393f8 --- /dev/null +++ b/src/GFX/Shading/Program.cpp @@ -0,0 +1,42 @@ +#include <GL/glew.h> +#include <stdexcept> +#include "Program.hpp" + +namespace MC::GFX::Shading { + +Program::Program(Shader fragment, Shader vertex) { + m_program = glCreateProgram(); + + glAttachShader(m_program, fragment.get()); + glAttachShader(m_program, vertex.get()); + + glLinkProgram(m_program); + + glDeleteShader(fragment.get()); + glDeleteShader(vertex.get()); + + GLint success; + glGetProgramiv(m_program, GL_LINK_STATUS, &success); + if(!success) { + char message[512] = {}; + glGetProgramInfoLog(m_program, 512, nullptr, message); + + throw std::runtime_error(message); + } +} + +void Program::bind() const { + glUseProgram(m_program); +} + +Uniform Program::uniform(const std::string& name) const { + auto index = glGetUniformLocation(m_program, name.c_str()); + + return {name, static_cast<uint32_t>(index)}; +} + +uint32_t Program::get() const { + return m_program; +} + +} diff --git a/src/GFX/Shading/Program.hpp b/src/GFX/Shading/Program.hpp new file mode 100644 index 0000000..15c9899 --- /dev/null +++ b/src/GFX/Shading/Program.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include <string> +#include <vector> +#include "Shader.hpp" +#include "../../Math/Math.hpp" +#include "Uniform.hpp" + +namespace MC::GFX::Shading { + +class Program { +public: + Program(Shader fragment, Shader vertex); + + uint32_t get() const; + + Uniform uniform(const std::string& name) const; + + void bind() const; + +private: + uint32_t m_program; +}; + +} \ No newline at end of file diff --git a/src/GFX/Shading/Shader.cpp b/src/GFX/Shading/Shader.cpp new file mode 100644 index 0000000..ff954a5 --- /dev/null +++ b/src/GFX/Shading/Shader.cpp @@ -0,0 +1,24 @@ +#include <GL/glew.h> +#include <stdexcept> +#include "Shader.hpp" + +namespace MC::GFX::Shading { + +Shader::Shader(uint32_t type, const char* source) { + m_shader = glCreateShader(type); + + glShaderSource(m_shader, 1, &source, nullptr); + glCompileShader(m_shader); + + GLint success; + glGetShaderiv(m_shader, GL_COMPILE_STATUS, &success); + if(!success) { + char message[512] = {}; + glGetShaderInfoLog(m_shader, 512, nullptr, message); + + throw std::runtime_error(message); + } +} + + +} \ No newline at end of file diff --git a/src/GFX/Shading/Shader.hpp b/src/GFX/Shading/Shader.hpp new file mode 100644 index 0000000..4a3d9cf --- /dev/null +++ b/src/GFX/Shading/Shader.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include <cstdint> +#include "../../Assets.hpp" + +namespace MC::GFX::Shading { + +class Shader { + +public: + uint32_t get() const { + return m_shader; + } + + static Shader create_vertex() { + return {GL_VERTEX_SHADER, Assets::Shaders::vertex}; + } + + static Shader create_fragment() { + return {GL_FRAGMENT_SHADER, Assets::Shaders::fragment}; + } + +private: + Shader(uint32_t type, const char* source); + + uint32_t m_shader; +}; + +} \ No newline at end of file diff --git a/src/GFX/Shading/Uniform.cpp b/src/GFX/Shading/Uniform.cpp new file mode 100644 index 0000000..9448574 --- /dev/null +++ b/src/GFX/Shading/Uniform.cpp @@ -0,0 +1,14 @@ +#include <GL/glew.h> +#include "Uniform.hpp" + +namespace MC::GFX::Shading { + +void Uniform::set(Matrix<4, 4> value) const { + glUniformMatrix4fv(m_index, 1, GL_TRUE, value.elements); +} + +void Uniform::set(Vector<3> value) const { + glUniform3f(m_index, value.x(), value.y(), value.z()); +} + +} diff --git a/src/GFX/Shading/Uniform.hpp b/src/GFX/Shading/Uniform.hpp new file mode 100644 index 0000000..8035dfe --- /dev/null +++ b/src/GFX/Shading/Uniform.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include <cstdint> +#include <string> +#include <utility> +#include "../../Math/Math.hpp" + +namespace MC::GFX::Shading { + +class Uniform { +public: + Uniform(std::string name, uint32_t index) + : m_name(std::move(name)), m_index(index) {}; + + void set(Matrix<4, 4> value) const; + void set(Vector<3> value) const; + +private: + std::string m_name; + uint32_t m_index; +}; + +} |
