// // Created by sebastian on 14.02.26. // #ifndef DICEWARS_SIEDLER_FRAMEBUFFEROBJECT_H #define DICEWARS_SIEDLER_FRAMEBUFFEROBJECT_H #include #include "glad/glad.h" class FramebufferObject { public: FramebufferObject(int width, int height, bool withDepth = true) : width(width), height(height) { // Fbo erzeugen glGenFramebuffers(1, &fboID); glBindFramebuffer(GL_FRAMEBUFFER, fboID); // Color Texture glGenTextures(1, &colorTextureID); glBindTexture(GL_TEXTURE_2D, colorTextureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTextureID, 0); if (withDepth) { glGenRenderbuffers(1, &rboDepthID); glBindRenderbuffer(GL_RENDERBUFFER, rboDepthID); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboDepthID); } if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { throw std::runtime_error("Framebuffer is incomplete!"); } glBindFramebuffer(GL_FRAMEBUFFER, 0); } ~FramebufferObject() { glDeleteFramebuffers(1, &fboID); glDeleteTextures(1, &colorTextureID); if (rboDepthID) glDeleteRenderbuffers(1, &rboDepthID); } void bind() const { glBindFramebuffer(GL_FRAMEBUFFER, fboID); } void unbind() const { glBindFramebuffer(GL_FRAMEBUFFER, 0); } GLuint getColorTexture() const; private: GLuint fboID = 0; GLuint colorTextureID = 0; GLuint rboDepthID = 0; int width, height; }; #endif //DICEWARS_SIEDLER_FRAMEBUFFEROBJECT_H