From 7215fd5433ce5c4ec38ff84486a896320ed9dd90 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Fri, 27 Sep 2024 19:19:35 +0200 Subject: [PATCH] blu --- assets/shaders/orange.fs | 7 +++++ assets/shaders/orange.vs | 7 +++++ src/renderer.cpp | 9 ++++++ src/shader.cpp | 62 ++++++++++++++++++++++++++++++++++++++++ src/shader.h | 11 +++++++ 5 files changed, 96 insertions(+) create mode 100644 assets/shaders/orange.fs create mode 100644 assets/shaders/orange.vs create mode 100644 src/shader.cpp create mode 100644 src/shader.h diff --git a/assets/shaders/orange.fs b/assets/shaders/orange.fs new file mode 100644 index 0000000..a9cb901 --- /dev/null +++ b/assets/shaders/orange.fs @@ -0,0 +1,7 @@ +#version 330 core + +out vec3 color; + +void main() { + color = vec3(0.2f, 0.2f, 0.8f); +} \ No newline at end of file diff --git a/assets/shaders/orange.vs b/assets/shaders/orange.vs new file mode 100644 index 0000000..a44d266 --- /dev/null +++ b/assets/shaders/orange.vs @@ -0,0 +1,7 @@ +#version 330 core + +in vec3 pos; + +void main() { + gl_Position = vec4(pos, 1.0f); +} \ No newline at end of file diff --git a/src/renderer.cpp b/src/renderer.cpp index 30c7bfa..b9d38c8 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include "shader.h" #include "renderer.h" @@ -11,6 +13,7 @@ float verts[] { }; unsigned int VAO, VBO; +Shader *shader = NULL; void renderInit(GLFWwindow* window) { glViewport(0, 0, 500, 500); @@ -27,12 +30,18 @@ void renderInit(GLFWwindow* window) { glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); + + // Compile shader + shader = new Shader("assets/shaders/orange.vs", "assets/shaders/orange.fs"); } void render(GLFWwindow* window) { glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + // Use shader + shader->use(); + glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); } \ No newline at end of file diff --git a/src/shader.cpp b/src/shader.cpp new file mode 100644 index 0000000..4285033 --- /dev/null +++ b/src/shader.cpp @@ -0,0 +1,62 @@ +#include +#include +#include + +#include "shader.h" + +std::string getContents(std::string filePath) { + std::ifstream ifs(filePath); + std::string content( (std::istreambuf_iterator(ifs) ), + (std::istreambuf_iterator() ) ); + + return content; +} + +unsigned int compileShader(std::string path, GLenum type) { + int success; + unsigned int shader = glCreateShader(type); + + std::string source = getContents(path); + const char* source2 = source.c_str(); + glShaderSource(shader, 1, &source2, NULL); + glCompileShader(shader); + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if(success != 1) { + char infoLog[256]; + glGetShaderInfoLog(shader, 512, NULL, infoLog); + printf("Fragment shader %s failed to compile: [%d]: %s\n", path.c_str(), success, infoLog); + abort(); + } + + return shader; +} + +Shader::Shader(std::string vertexShaderPath, std::string fragmentShaderPath) { + unsigned int vertexShader = compileShader(vertexShaderPath, GL_VERTEX_SHADER); + unsigned int fragmentShader = compileShader(fragmentShaderPath, GL_FRAGMENT_SHADER); + + int success; + + id = glCreateProgram(); + glAttachShader(id, vertexShader); + glAttachShader(id, fragmentShader); + glLinkProgram(id); + glGetProgramiv(id, GL_LINK_STATUS, &success); + if(success != 1) { + char infoLog[256]; + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + printf("Shader program failed to link: [%d]: %s\n", success, infoLog); + abort(); + } + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); +} + +Shader::~Shader() { + glDeleteProgram(id); +} + +void Shader::use() { + glUseProgram(id); +} \ No newline at end of file diff --git a/src/shader.h b/src/shader.h new file mode 100644 index 0000000..e482036 --- /dev/null +++ b/src/shader.h @@ -0,0 +1,11 @@ +#pragma once +#include + +class Shader { + unsigned int id; + +public: + void use(); + Shader(std::string vertexShaderPath, std::string fragmentShaderPath); + ~Shader(); +}; \ No newline at end of file