Shader Rendering (not working)

This commit is contained in:
Sebastian Böckelmann 2026-01-04 17:58:55 +01:00
parent 07f75966f2
commit 52923d3a92
10 changed files with 175 additions and 2 deletions

View File

@ -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

View File

@ -0,0 +1,9 @@
#version 400 core
in vec3 color;
out vec4 outColor;
void main(void) {
outColor = vec4(color, 1.0f);
}

View File

@ -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);
}

View File

@ -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<int>(m_Data.Width), static_cast<int>(m_Data.Height), m_Data.Title.c_str(), nullptr, nullptr);

View File

@ -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) {

View File

@ -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;
};

View File

@ -0,0 +1,77 @@
//
// Created by sebastian on 24.12.25.
//
#include "ShaderProgram.h"
#include <fstream>
#include <iostream>
#include <sstream>
#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;
}

View File

@ -0,0 +1,32 @@
//
// Created by sebastian on 24.12.25.
//
#ifndef DICEWARS_SIEDLER_SHADERPROGRAM_H
#define DICEWARS_SIEDLER_SHADERPROGRAM_H
#include <string>
#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

View File

@ -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");
}

View File

@ -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