From 291f774a958eb8b1f97dc438f262587852a3545d Mon Sep 17 00:00:00 2001 From: miaurizius Date: Wed, 15 Apr 2026 23:54:09 +0200 Subject: [PATCH] added uniforms --- CMakeLists.txt | 5 ++- include/IndexBuffer.hpp | 34 +++++++++++++++++ include/Shader.hpp | 2 + shaders/basic.frag | 4 +- src/Shader.cpp | 4 ++ src/main.cpp | 85 ++++++++++++++++++++++++++++++++++++++--- 6 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 include/IndexBuffer.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d39431..db2a2bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,10 @@ add_executable(${PROJECT_NAME} src/main.cpp include/VertexBuffer.hpp include/defines.hpp src/Shader.cpp - include/Shader.hpp) + include/Shader.hpp + include/IndexBuffer.hpp) + +target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:_DEBUG>) target_include_directories(${PROJECT_NAME} PRIVATE include) target_include_directories(${PROJECT_NAME} PRIVATE shaders) diff --git a/include/IndexBuffer.hpp b/include/IndexBuffer.hpp new file mode 100644 index 0000000..3f9f652 --- /dev/null +++ b/include/IndexBuffer.hpp @@ -0,0 +1,34 @@ +#pragma once +#include + +#include "defines.hpp" + +struct IndexBuffer { + IndexBuffer(void* data, uint32 numIndices, uint8 elementSize) { + glGenBuffers(1, &bufferId); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferId); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*elementSize, data, GL_STATIC_DRAW); + + // POSITION + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex,x)); + // COLOR + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex,r)); + + glBindVertexArray(0); + }; + virtual ~IndexBuffer() { + glDeleteBuffers(1, &bufferId); + } + + void bind() { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferId); + } + void unbind() { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } + +private: + GLuint bufferId; +}; \ No newline at end of file diff --git a/include/Shader.hpp b/include/Shader.hpp index 2eddf92..8b3c042 100644 --- a/include/Shader.hpp +++ b/include/Shader.hpp @@ -10,6 +10,8 @@ struct Shader { void bind(); void unbind(); + GLuint getShaderId(); + private: GLuint compile(std::string shaderSource, GLenum shaderType); std::string parse(const char* filename); diff --git a/shaders/basic.frag b/shaders/basic.frag index 3957c96..acf04ed 100644 --- a/shaders/basic.frag +++ b/shaders/basic.frag @@ -4,6 +4,8 @@ layout(location = 0) out vec4 f_color; in vec4 v_color; +uniform vec4 u_color; + void main() { - f_color = v_color; + f_color = u_color; } \ No newline at end of file diff --git a/src/Shader.cpp b/src/Shader.cpp index 75285e9..3bfee20 100644 --- a/src/Shader.cpp +++ b/src/Shader.cpp @@ -18,6 +18,10 @@ void Shader::unbind() { glUseProgram(0); } +GLuint Shader::getShaderId() { + return this->shaderId; +} + GLuint Shader::compile(std::string shaderSource, GLenum shaderType) { GLuint id = glCreateShader(shaderType); const char* src = shaderSource.c_str(); diff --git a/src/main.cpp b/src/main.cpp index 88c2930..ed76281 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,12 +2,66 @@ #define GLEW_STATIC #include #define SDL_MAIN_HANDLED +#include #include - #include "defines.hpp" +#include "IndexBuffer.hpp" #include "VertexBuffer.hpp" #include "Shader.hpp" +void openGLDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam) { + if (severity == GL_DEBUG_SEVERITY_NOTIFICATION) return; //ignore notifications (mostly performance information) + + std::cerr << "--------------------- OpenGL Debug Message ---------------------" << std::endl; + std::cerr << "Message: " << message << std::endl; + std::cerr << "ID: " << id << std::endl; + + std::string sourceStr; + switch (source) { + case GL_DEBUG_SOURCE_API: sourceStr = "API"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceStr = "Window System"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceStr = "Shader Compiler"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: sourceStr = "Third Party"; break; + case GL_DEBUG_SOURCE_APPLICATION: sourceStr = "Application"; break; + case GL_DEBUG_SOURCE_OTHER: sourceStr = "Other"; break; + default: sourceStr = "Unknown"; break; + } + + std::string typeStr; + switch (type) { + case GL_DEBUG_TYPE_ERROR: typeStr = "Error"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeStr = "Deprecated Behavior"; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeStr = "Undefined Behavior"; break; + case GL_DEBUG_TYPE_PORTABILITY: typeStr = "Portability"; break; + case GL_DEBUG_TYPE_PERFORMANCE: typeStr = "Performance"; break; + case GL_DEBUG_TYPE_MARKER: typeStr = "Marker"; break; + case GL_DEBUG_TYPE_PUSH_GROUP: typeStr = "Push Group"; break; + case GL_DEBUG_TYPE_POP_GROUP: typeStr = "Pop Group"; break; + case GL_DEBUG_TYPE_OTHER: typeStr = "Other"; break; + default: typeStr = "Unknown"; break; + } + + std::string severityStr; + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH: severityStr = "HIGH"; break; + case GL_DEBUG_SEVERITY_MEDIUM: severityStr = "MEDIUM"; break; + case GL_DEBUG_SEVERITY_LOW: severityStr = "LOW"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: severityStr = "NOTIFICATION"; break; + default: severityStr = "UNKNOWN"; break; + } + + std::cerr << "Source: " << sourceStr << std::endl; + std::cerr << "Type: " << typeStr << std::endl; + std::cerr << "Severity: " << severityStr << std::endl; + std::cerr << "---------------------------------------------------------------" << std::endl; + + // Breakpoint + if (severity == GL_DEBUG_SEVERITY_HIGH) { + std::cerr << "Kritischer Fehler! Programm wird unterbrochen." << std::endl; + __builtin_trap(); // only for linux/gcc/clang + } +} + int main() { SDL_Init(SDL_INIT_VIDEO); @@ -18,6 +72,10 @@ int main() { SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + #ifdef _DEBUG + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); //remove for stable release + #endif + uint32 flags = SDL_WINDOW_OPENGL; //| SDL_WINDOW_FULLSCREEN; @@ -35,6 +93,11 @@ int main() { return -1; } std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << std::endl; + #ifdef _DEBUG + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + glDebugMessageCallback(openGLDebugCallback, nullptr); + #endif Vertex vertices[] = { Vertex{-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f}, @@ -51,10 +114,7 @@ int main() { }; uint32 numIndices = sizeof(indices) / sizeof(uint32); - GLuint indexBuffer; - glGenBuffers(1, &indexBuffer); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices * sizeof(indices[0]), indices, GL_STATIC_DRAW); + IndexBuffer indexBuffer(indices, numIndices, sizeof(indices[0])); VertexBuffer vertexBuffer(vertices, numVertices); vertexBuffer.unbind(); @@ -62,6 +122,11 @@ int main() { Shader shader("shaders/basic.vert", "shaders/basic.frag"); shader.bind(); + int colorUniformLocation = glGetUniformLocation(shader.getShaderId(), "u_color"); + if (colorUniformLocation != 1) { + glUniform4f(colorUniformLocation, 1.0f, 0.0f, 1.0f, 1.0f); + } + const uint64 perfCounterFrequency = SDL_GetPerformanceFrequency(); uint64 lastCounter = SDL_GetPerformanceCounter(); float32 delta = 0.0f; @@ -69,17 +134,25 @@ int main() { // WIREFRAME //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + float time = 0.0f; + bool running = true; SDL_Event e; while (running) { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); + time += delta; + + if (colorUniformLocation != 1) { + glUniform4f(colorUniformLocation, sinf(time)*sinf(time), 0.0f, 1.0f, 1.0f); + } // FRAME GENERATION vertexBuffer.bind(); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); + indexBuffer.bind(); glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_INT, 0); vertexBuffer.unbind(); + indexBuffer.unbind(); SDL_GL_SwapWindow(window);