From 751c171a97a67f3c2077e120492746babde1d43c Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 10 Dec 2016 19:32:27 +0200 Subject: [PATCH] Support attaching 3D and 2DArray textures to Framebuffer --- source/framebuffer.cpp | 29 +++++++++++++++++++++++++++++ source/framebuffer.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/source/framebuffer.cpp b/source/framebuffer.cpp index a3197f59..c7bfcd5a 100644 --- a/source/framebuffer.cpp +++ b/source/framebuffer.cpp @@ -2,12 +2,14 @@ #include #include #include +#include #include #include "error.h" #include "framebuffer.h" #include "misc.h" #include "renderbuffer.h" #include "texture2d.h" +#include "texture3d.h" using namespace std; @@ -113,6 +115,16 @@ void Framebuffer::update_attachment(unsigned mask) const else glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, attch.type, attch.tex->get_id(), attch.level); } + else if(attch.type==GL_TEXTURE_3D || attch.type==GL_TEXTURE_2D_ARRAY) + { + static_cast(attch.tex)->allocate(attch.level); + if(ARB_direct_state_access) + glNamedFramebufferTextureLayer(id, attch.attachment, attch.tex->get_id(), attch.level, attch.layer); + else if(attch.type==GL_TEXTURE_2D_ARRAY) + glFramebufferTextureLayer(GL_FRAMEBUFFER, attch.attachment, attch.tex->get_id(), attch.level, attch.layer); + else + glFramebufferTexture3D(GL_FRAMEBUFFER, attch.attachment, attch.type, attch.tex->get_id(), attch.level, attch.layer); + } else if(attch.type==GL_TEXTURE_CUBE_MAP) { static_cast(attch.tex)->allocate(attch.level); @@ -171,6 +183,12 @@ void Framebuffer::check_size() width = max(tex->get_width()>>i->level, 1U); height = max(tex->get_height()>>i->level, 1U); } + else if(i->type==GL_TEXTURE_3D || i->type==GL_TEXTURE_2D_ARRAY) + { + Texture3D *tex = static_cast(i->tex); + width = max(tex->get_width()>>i->level, 1U); + height = max(tex->get_height()>>i->level, 1U); + } else if(i->type==GL_TEXTURE_CUBE_MAP) { width = max(static_cast(i->tex)->get_size()>>i->level, 1U); @@ -213,6 +231,17 @@ void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, unsigned l check_size(); } +void Framebuffer::attach(FramebufferAttachment attch, Texture3D &tex, unsigned layer, unsigned level) +{ + if(!id) + throw invalid_operation("Framebuffer::attach"); + + unsigned i = get_attachment_index(attch); + attachments[i].set(tex, level, layer); + update_attachment(1<