X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fframebuffer.h;h=f2fbfea40e19bca9577cd97a540d6bfcfb3b1673;hb=e92de029768eef5f0fd744329e589161b46d0762;hp=275f516e8d4d3b22acca3393a48065cb5d5422fb;hpb=715672cf2c64dab0744db676fdee255ee3a4cef7;p=libs%2Fgl.git diff --git a/source/core/framebuffer.h b/source/core/framebuffer.h index 275f516e..f2fbfea4 100644 --- a/source/core/framebuffer.h +++ b/source/core/framebuffer.h @@ -2,6 +2,7 @@ #define MSP_GL_FRAMEBUFFER_H_ #include +#include "frameformat.h" #include "gl.h" #include "texturecube.h" #include @@ -12,22 +13,12 @@ namespace Msp { namespace GL { -class Renderbuffer; class Texture; class Texture2D; +class Texture2DMultisample; class Texture3D; class WindowView; -enum FramebufferAttachment -{ - COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0, - COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1, - COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2, - COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3, - DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT, - STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT -}; - enum FramebufferStatus { FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, @@ -63,8 +54,8 @@ common application is rendering to a texture, which can then be used for fullscreen shader effects. A framebuffer consist of a number of logical buffers, such as color and depth -buffers. Renderbuffers and Textures can be attached to the logical buffers. At -least one image must be attached for the framebuffer to be usable. +buffers. Textures can be attached to the logical buffers. At least one image +must be attached for the framebuffer to be usable. Requires the GL_EXT_framebuffer_object extension. The blit functions require the GL_EXT_framebuffer_blit extension. @@ -74,23 +65,17 @@ class Framebuffer private: struct Attachment { - FramebufferAttachment attachment; - GLenum type; - union - { - Renderbuffer *rbuf; - Texture *tex; - }; + Texture *tex; unsigned level; int layer; - Attachment(FramebufferAttachment); - void set(Renderbuffer &); + Attachment(); void set(Texture &, unsigned, int); void clear(); }; unsigned id; + FrameFormat format; std::vector attachments; unsigned width; unsigned height; @@ -99,25 +84,48 @@ private: Framebuffer(unsigned); public: + /** Creates an empty framebuffer. Format must be set before textures can + be attached. */ Framebuffer(); + + /** Creates a framebuffer and sets its format to a single attachment. */ + Framebuffer(FrameAttachment); + + /** Creates a framebuffer and sets its format. */ + Framebuffer(const FrameFormat &); + +private: + void init(); +public: ~Framebuffer(); + /** Sets the format of the framebuffer. Once the format is set, it can't + be changed. */ + void set_format(const FrameFormat &); + + const FrameFormat &get_format() const { return format; } + unsigned get_width() const { return width; } unsigned get_height() const { return height; } private: void update() const; void check_size(); - unsigned get_attachment_index(FramebufferAttachment); - void set_texture_attachment(FramebufferAttachment, Texture &, unsigned, int); + void set_attachment(FrameAttachment, Texture &, unsigned, int, unsigned); public: - void attach(FramebufferAttachment attch, Renderbuffer &rbuf); - void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0); - void attach(FramebufferAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0); - void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0); - void attach_layered(FramebufferAttachment attch, Texture3D &tex, unsigned level = 0); - void attach_layered(FramebufferAttachment attch, TextureCube &tex, unsigned level = 0); - void detach(FramebufferAttachment attch); + + /** Attaches a texture to the framebuffer. Only the attachment point + portion of attch is considered; pixel format is ignored. The framebuffer + must have a format and the format of the texture must match that defined + in the framebuffer for this attachment point. */ + void attach(FrameAttachment attch, Texture2D &tex, unsigned level = 0); + + void attach(FrameAttachment attch, Texture2DMultisample &tex); + void attach(FrameAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0); + void attach(FrameAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0); + void attach_layered(FrameAttachment attch, Texture3D &tex, unsigned level = 0); + void attach_layered(FrameAttachment attch, TextureCube &tex, unsigned level = 0); + void detach(FrameAttachment attch); void resize(const WindowView &);