10#include "galaxy/error/Log.hpp"
25 , m_clear_colour {0.0f, 0.0f, 0.0f, 0.0f}
27 glCreateFramebuffers(1, &
m_id);
34 glDeleteFramebuffers(1, &this->
m_id);
39 glDeleteTextures(1, &this->
m_colour);
63 f.m_storageattach = 0;
72 glDeleteFramebuffers(1, &this->
m_id);
77 glDeleteTextures(1, &this->
m_colour);
100 f.m_renderbuffer = 0;
101 f.m_storageattach = 0;
111 glDeleteFramebuffers(1, &
m_id);
140 glCreateTextures(GL_TEXTURE_2D, 1, &
m_colour);
143 glTextureParameteri(
m_colour, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
144 glTextureParameteri(
m_colour, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
145 glTextureParameteri(
m_colour, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
146 glTextureParameteri(
m_colour, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
147 glTextureParameteri(
m_colour, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
148 glTextureParameterf(
m_colour, GL_TEXTURE_MAX_ANISOTROPY, 1.0f);
150 static auto s_fbo = 0;
151 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &s_fbo);
153 glBindFramebuffer(GL_FRAMEBUFFER,
m_id);
154 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
m_colour, 0);
155 glBindFramebuffer(GL_FRAMEBUFFER, s_fbo);
165 static auto s_fbo = 0;
166 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &s_fbo);
168 glBindFramebuffer(GL_FRAMEBUFFER,
m_id);
172 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
m_width,
m_height);
173 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
m_renderbuffer);
175 glBindRenderbuffer(GL_RENDERBUFFER, 0);
176 glBindFramebuffer(GL_FRAMEBUFFER, s_fbo);
189 glTextureParameteri(
m_storageattach, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
190 glTextureParameteri(
m_storageattach, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
191 glTextureParameteri(
m_storageattach, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
192 glTextureParameteri(
m_storageattach, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
193 glTextureParameteri(
m_storageattach, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
196 static auto s_fbo = 0;
197 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &s_fbo);
199 glBindFramebuffer(GL_FRAMEBUFFER,
m_id);
200 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
m_storageattach, 0);
201 glBindFramebuffer(GL_FRAMEBUFFER, s_fbo);
206 meta::vector<unsigned int> used;
210 used.push_back(GL_COLOR_ATTACHMENT0);
215 used.push_back(GL_COLOR_ATTACHMENT1);
218 glNamedFramebufferDrawBuffers(
m_id,
static_cast<GLsizei
>(used.size()), used.data());
220 const auto status = glCheckNamedFramebufferStatus(
m_id, GL_FRAMEBUFFER);
221 if (status != GL_FRAMEBUFFER_COMPLETE)
226 case GL_FRAMEBUFFER_UNDEFINED:
227 reason =
"GL_FRAMEBUFFER_UNDEFINED";
229 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
230 reason =
"GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
232 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
233 reason =
"GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
235 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
236 reason =
"GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER";
238 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
239 reason =
"GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER";
241 case GL_FRAMEBUFFER_UNSUPPORTED:
242 reason =
"GL_FRAMEBUFFER_UNSUPPORTED";
244 case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
245 reason =
"GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE";
247 case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
248 reason =
"GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS";
261 static auto s_fbo = 0;
262 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &s_fbo);
264 glBindFramebuffer(GL_FRAMEBUFFER,
m_id);
268 glReadPixels(x, y, 1, 1, GL_RED_INTEGER, GL_INT, &data);
270 glBindFramebuffer(GL_FRAMEBUFFER, s_fbo);
276 glClearNamedFramebufferiv(
m_id, GL_COLOR, 1, &val);
281 const auto& vec = col.
vec4();
291 glBindFramebuffer(GL_FRAMEBUFFER,
m_id);
297 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
303 glBindFramebuffer(GL_FRAMEBUFFER, 0);
315 constexpr const auto CLEAR_DEPTH = 1.0f;
316 glClearNamedFramebufferfv(
m_renderbuffer, GL_DEPTH, 0, &CLEAR_DEPTH);
332 glDeleteFramebuffers(1, &
m_id);
349 glCreateFramebuffers(1, &
m_id);
#define GALAXY_LOG(level, msg,...)
Represents an RGBA colour.
glm::vec4 & vec4()
Get vec4.
OpenGL framebuffer to render to.
std::array< float, 4 > m_clear_colour
Clear colour.
unsigned int m_renderbuffer
Renderbuffer attachment.
unsigned int m_id
OpenGL handle.
void clear_storagebuffer(const int val)
Clear storagebuffer.
unsigned int m_storageattach
Storage attachment id.
void add_colour_attachment(const int width, const int height)
Add a colour attachment to the framebuffer.
void add_depth_stencil_renderbuffer()
Adds a depth and stencil supported renderbuffer to the framebuffer.
void reset()
Completely delete objects.
int width() const
Get width.
int height() const
Get height.
unsigned int id() const
Get OpenGL framebuffer object.
unsigned int texture() const
Get colour attachment texture id.
void create()
Construct framebuffer from attachments and renderbuffers.
Framebuffer & operator=(Framebuffer &&)
Move assignment operator.
int read_storagebuffer(const int x, const int y)
Read storage buffer.
unsigned int m_colour
Colour attachment id.
~Framebuffer()
Destructor.
void end()
Unbind framebuffer.
int m_height
Height cache.
void add_storage_attachment()
Add an attachment to store an integer.
void clear()
Clear framebuffer attachments.
Framebuffer()
Constructor.
void begin(const bool clear=true)
Bind framebuffer for rendering to.
void set_clear_colour(const graphics::Colour &col)
Set clear colour.