diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d8a1b1..0996f00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,11 @@ add_executable(Dicewars_Siedler src/main.cpp src/engine/layer/Layer.cpp src/engine/layer/Layer.h src/engine/layer/GameLayer.cpp - src/engine/layer/GameLayer.h) + src/engine/layer/GameLayer.h + src/engine/renderer/shaders/ShaderProgram.cpp + src/engine/renderer/shaders/ShaderProgram.h + src/engine/renderer/shaders/StaticShader.cpp + src/engine/renderer/shaders/StaticShader.h) target_include_directories(Dicewars_Siedler PRIVATE lib/glfw/include diff --git a/assets/shaders/fragmentShader.glsl b/assets/shaders/fragmentShader.glsl new file mode 100644 index 0000000..2861c9e --- /dev/null +++ b/assets/shaders/fragmentShader.glsl @@ -0,0 +1,9 @@ +#version 400 core + +in vec3 color; + +out vec4 outColor; + +void main(void) { + outColor = vec4(color, 1.0f); +} \ No newline at end of file diff --git a/assets/shaders/vertexShader.glsl b/assets/shaders/vertexShader.glsl new file mode 100644 index 0000000..afa898a --- /dev/null +++ b/assets/shaders/vertexShader.glsl @@ -0,0 +1,11 @@ +#version 400 core + +in vec3 position; + +out vec3 color; + +void main() +{ + gl_Position = vec4(position, 1.0); + color = vec3(position.x + 0.5, 1.0, position.y + 0.5); +} diff --git a/src/engine/platform/glfw/GLFWWindow.cpp b/src/engine/platform/glfw/GLFWWindow.cpp index 246034d..5f7bf50 100644 --- a/src/engine/platform/glfw/GLFWWindow.cpp +++ b/src/engine/platform/glfw/GLFWWindow.cpp @@ -42,7 +42,7 @@ void GLFWWindow::Init(const WindowProps& props) glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); - //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); m_Window = glfwCreateWindow( static_cast(m_Data.Width), static_cast(m_Data.Height), m_Data.Title.c_str(), nullptr, nullptr); diff --git a/src/engine/renderer/Renderer.cpp b/src/engine/renderer/Renderer.cpp index ef5f0d5..8f52aa9 100644 --- a/src/engine/renderer/Renderer.cpp +++ b/src/engine/renderer/Renderer.cpp @@ -13,7 +13,9 @@ void Renderer::prepare() { void Renderer::renderFrame(const RawModel& model) { prepare(); + staticShader.start(); renderRawModel(model); + staticShader.stop(); } void Renderer::renderRawModel(const RawModel& model) { diff --git a/src/engine/renderer/Renderer.h b/src/engine/renderer/Renderer.h index 4f77fe1..fb8d2fd 100644 --- a/src/engine/renderer/Renderer.h +++ b/src/engine/renderer/Renderer.h @@ -5,6 +5,7 @@ #ifndef DICEWARS_SIEDLER_RENDERER_H #define DICEWARS_SIEDLER_RENDERER_H #include "model/RawModel.h" +#include "shaders/StaticShader.h" class Renderer { @@ -13,6 +14,7 @@ public: void renderFrame(const RawModel& moddel); private: void renderRawModel(const RawModel &model); + StaticShader staticShader; }; diff --git a/src/engine/renderer/shaders/ShaderProgram.cpp b/src/engine/renderer/shaders/ShaderProgram.cpp new file mode 100644 index 0000000..fa2c111 --- /dev/null +++ b/src/engine/renderer/shaders/ShaderProgram.cpp @@ -0,0 +1,77 @@ +// +// Created by sebastian on 24.12.25. +// + +#include "ShaderProgram.h" + +#include +#include +#include + +#include "glad/glad.h" + +ShaderProgram::ShaderProgram(std::string vert, std::string frag) { + vertexShaderID = loadShader(vert, GL_VERTEX_SHADER); + fragmentShaderID = loadShader(frag, GL_FRAGMENT_SHADER); + + programID = glCreateProgram(); + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); + glValidateProgram(programID); +} + +void ShaderProgram::start(){ + glUseProgram(programID); +} + +void ShaderProgram::stop(){ + glUseProgram(0); +} + +void ShaderProgram::cleanUp() { + stop(); + glDetachShader(programID, vertexShaderID); + glDetachShader(programID, fragmentShaderID); + glDeleteShader(vertexShaderID); + glDeleteShader(fragmentShaderID); + glDeleteProgram(programID); +} + + +void ShaderProgram::bindAttribute(int attribute, const std::string& variableName) const { + glBindAttribLocation(programID, attribute, variableName.c_str()); +} + +int ShaderProgram::loadShader(const std::string& file, int type) { + std::ifstream shaderFile(file); + if (!shaderFile.is_open()) + { + std::cerr << "Failed to open shader file: " << file << std::endl; + return 0; + } + + std::stringstream buffer; + buffer << shaderFile.rdbuf(); + std::string sourceStr = buffer.str(); + const char* source = sourceStr.c_str(); + + GLuint shaderID = glCreateShader(type); + glShaderSource(shaderID, 1, &source, nullptr); + glCompileShader(shaderID); + + // 3. Kompilierungsstatus prüfen + GLint success; + glGetShaderiv(shaderID, GL_COMPILE_STATUS, &success); + if (!success) + { + char infoLog[512]; + glGetShaderInfoLog(shaderID, 512, nullptr, infoLog); + std::cerr << "ERROR: Shader compilation failed (" + << file << ")\n" + << infoLog << std::endl; + return 0; + } + + return shaderID; +} diff --git a/src/engine/renderer/shaders/ShaderProgram.h b/src/engine/renderer/shaders/ShaderProgram.h new file mode 100644 index 0000000..98cfecb --- /dev/null +++ b/src/engine/renderer/shaders/ShaderProgram.h @@ -0,0 +1,32 @@ +// +// Created by sebastian on 24.12.25. +// + +#ifndef DICEWARS_SIEDLER_SHADERPROGRAM_H +#define DICEWARS_SIEDLER_SHADERPROGRAM_H +#include + +#include "../../../../lib/glfw/src/internal.h" + + +class ShaderProgram { +public: + ShaderProgram(std::string vert, std::string frag); + void start(); + void stop(); + void cleanUp(); +protected: + GLuint programID; + GLuint vertexShaderID; + GLuint fragmentShaderID; + + void bindAttribute(int attribute, const std::string& variableName) const; + + virtual void bindAttributes() const = 0; + +private: + static int loadShader(const std::string& file, int type); +}; + + +#endif //DICEWARS_SIEDLER_SHADERPROGRAM_H \ No newline at end of file diff --git a/src/engine/renderer/shaders/StaticShader.cpp b/src/engine/renderer/shaders/StaticShader.cpp new file mode 100644 index 0000000..fb8d9c1 --- /dev/null +++ b/src/engine/renderer/shaders/StaticShader.cpp @@ -0,0 +1,13 @@ +// +// Created by sebastian on 24.12.25. +// + +#include "StaticShader.h" + +StaticShader::StaticShader() : ShaderProgram(VERTEX_FILE, FRAGMENT_FILE) { + StaticShader::bindAttributes(); +} + +void StaticShader::bindAttributes() const { + bindAttribute(0, "position"); +} diff --git a/src/engine/renderer/shaders/StaticShader.h b/src/engine/renderer/shaders/StaticShader.h new file mode 100644 index 0000000..444c51e --- /dev/null +++ b/src/engine/renderer/shaders/StaticShader.h @@ -0,0 +1,23 @@ +// +// Created by sebastian on 24.12.25. +// + +#ifndef DICEWARS_SIEDLER_STATICSHADER_H +#define DICEWARS_SIEDLER_STATICSHADER_H +#include "ShaderProgram.h" + + +class StaticShader: public ShaderProgram +{ +public: + StaticShader(); +private: + inline static const std::string VERTEX_FILE = "assets/shaders/fragmentShader.glsl"; + inline static const std::string FRAGMENT_FILE = "assets/shaders/vertexShader.glsl"; + +protected: + void bindAttributes() const override; +}; + + +#endif //DICEWARS_SIEDLER_STATICSHADER_H \ No newline at end of file