1 #ifndef MSP_GL_FRAMEBUFFER_H_
2 #define MSP_GL_FRAMEBUFFER_H_
7 #include "texturecube.h"
16 enum FramebufferAttachment
18 COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0,
19 COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1,
20 COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2,
21 COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3,
22 DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT,
23 STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT
26 enum FramebufferStatus
28 FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
29 FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
30 FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT,
31 FRAMEBUFFER_INCOMPLETE_FORMATS = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT,
32 FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER,
33 FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER,
34 FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED,
35 FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE
40 COLOR_BUFFER_BIT = GL_COLOR_BUFFER_BIT,
41 DEPTH_BUFFER_BIT = GL_DEPTH_BUFFER_BIT,
42 STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT,
43 ACCUM_BUFFER_BIT = GL_ACCUM_BUFFER_BIT
49 FRONT_LEFT = GL_FRONT_LEFT,
50 FRONT_RIGHT = GL_FRONT_RIGHT,
51 BACK_LEFT = GL_BACK_LEFT,
52 BACK_RIGHT = GL_BACK_RIGHT,
57 FRONT_AND_BACK = GL_FRONT_AND_BACK
61 Framebuffer objects can be used to perform offscreen rendering. The most
62 common application is rendering to a texture, which can then be used for
63 fullscreen shader effects.
65 A framebuffer consist of a number of logical buffers, such as color and depth
66 buffers. Renderbuffers and Textures can be attached to the logical buffers. At
67 least one image must be attached for the framebuffer to be usable.
69 Requires the GL_EXT_framebuffer_object extension. The blit functions require
70 the GL_EXT_framebuffer_blit extension.
72 class Framebuffer: public Bindable<Framebuffer>
77 FramebufferAttachment attachment;
87 Attachment(FramebufferAttachment);
88 void set(Renderbuffer &);
89 void set(Texture &, GLenum, unsigned);
94 std::vector<Attachment> attachments;
97 mutable unsigned dirty;
99 Framebuffer(unsigned);
104 unsigned get_width() const { return width; }
105 unsigned get_height() const { return height; }
108 void update_attachment(unsigned) const;
110 unsigned get_attachment_index(FramebufferAttachment);
112 void attach(FramebufferAttachment attch, Renderbuffer &rbuf);
113 void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0);
114 void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0);
115 void detach(FramebufferAttachment attch);
117 /** Checks the completeness of the framebuffer. Returns
118 FRAMEBUFFER_COMPLETE if the framebuffer is complete and can be rendered to,
119 or one of the error status codes otherwise. */
120 FramebufferStatus check_status() const;
122 void clear(BufferBits);
124 /** Blits a region from another framebuffer into this one. If the source
125 and destination regions have different dimensions, the contents will be
126 stretched. If filter is true, linear interpolation will be used, otherwise
127 no interpolation is done. */
128 void blit_from(const Framebuffer &other, int sx0, int sy0, int sx1, int sy1,
129 int dx0, int dy0, int dx1, int dy1, BufferBits bits, bool filter);
131 /** Blits a region from another framebuffer into this one, retaining its
133 void blit_from(const Framebuffer & other, int sx, int sy,
134 unsigned wd, unsigned ht, int dx, int dy, BufferBits bits);
136 /** Blits the entire contents of another framebuffer into this one. */
137 void blit_from(const Framebuffer &other, BufferBits bits, bool filter);
141 static const Framebuffer *current();
142 static void unbind();
144 static Framebuffer &system();
147 inline BufferBits operator|(BufferBits a, BufferBits b)
148 { return static_cast<BufferBits>(static_cast<int>(a)|static_cast<int>(b)); }