3 This file is part of libmspgl
4 Copyright © 2007, 2009-2011 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
8 #ifndef MSP_GL_FRAMEBUFFER_H_
9 #define MSP_GL_FRAMEBUFFER_H_
22 enum FramebufferAttachment
24 COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0_EXT,
25 COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1_EXT,
26 COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2_EXT,
27 COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3_EXT,
28 DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT_EXT,
29 STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT_EXT
32 enum FramebufferStatus
34 FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT,
35 FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT,
36 FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT,
37 FRAMEBUFFER_INCOMPLETE_FORMATS = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT,
38 FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT,
39 FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT,
40 FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED_EXT,
41 FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT
46 COLOR_BUFFER_BIT = GL_COLOR_BUFFER_BIT,
47 DEPTH_BUFFER_BIT = GL_DEPTH_BUFFER_BIT,
48 STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT,
49 ACCUM_BUFFER_BIT = GL_ACCUM_BUFFER_BIT
55 FRONT_LEFT = GL_FRONT_LEFT,
56 FRONT_RIGHT = GL_FRONT_RIGHT,
57 BACK_LEFT = GL_BACK_LEFT,
58 BACK_RIGHT = GL_BACK_RIGHT,
63 FRONT_AND_BACK = GL_FRONT_AND_BACK
67 Framebuffer objects can be used to perform offscreen rendering. The most
68 common application is rendering to a texture, which can then be used for
69 fullscreen shader effects.
71 A framebuffer consist of a number of logical buffers, such as color and depth
72 buffers. Renderbuffers and Textures can be attached to the logical buffers. At
73 least one image must be attached for the framebuffer to be usable.
75 Requires the GL_EXT_framebuffer_object extension.
77 class Framebuffer: public Bindable<Framebuffer>
82 FramebufferAttachment attachment;
91 Attachment(FramebufferAttachment);
92 void set(Renderbuffer &);
93 void set(Texture &, unsigned);
98 std::vector<Attachment> attachments;
101 mutable unsigned dirty;
103 Framebuffer(unsigned);
108 unsigned get_width() const { return width; }
109 unsigned get_height() const { return height; }
112 void update_attachment(unsigned) const;
115 void attach(FramebufferAttachment attch, Renderbuffer &rbuf);
116 void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0);
117 void detach(FramebufferAttachment attch);
120 Checks the completeness status of the framebuffer. Returns
121 FRAMEBUFFER_COMPLETE if the framebuffer is complate and can be rendered to,
122 or one of the error status codes otherwise.
124 FramebufferStatus check_status() const;
126 void clear(BufferBits);
127 void blit_from(const Framebuffer &, int, int, int, int, int, int, int, int, BufferBits, bool);
128 void blit_from(const Framebuffer &, int, int, unsigned, unsigned, int, int, BufferBits);
129 void blit_from(const Framebuffer &, BufferBits, bool);
133 static const Framebuffer *current();
134 static void unbind();
136 static Framebuffer &system();
138 unsigned get_attachment_index(FramebufferAttachment);
141 inline BufferBits operator|(BufferBits a, BufferBits b)
142 { return static_cast<BufferBits>(static_cast<int>(a)|static_cast<int>(b)); }