};
/**
-Framebuffer objects can be used to perform offscreen rendering. The most
-common application is rendering to a texture, which can then be used for
-fullscreen shader effects.
+Uses one or more textures as buffers to draw into. Framebuffers can contain
+multiple color buffers to match multiple outputs from a fragment shader, but
+only one depth and stencil buffer.
-A framebuffer consist of a number of logical buffers, such as color and depth
-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.
+RenderTarget provides a higher-level interface which manages the textures as
+well as the framebuffer itself.
*/
class Framebuffer: public FramebufferBackend
{
private:
struct Attachment
{
- Texture *tex;
- unsigned level;
- int layer;
+ Texture *tex = 0;
+ unsigned level = 0;
+ int layer = 0;
- Attachment();
void set(Texture &, unsigned, int);
void clear();
};
/** Creates a framebuffer and sets its format. */
Framebuffer(const FrameFormat &);
-private:
- void init();
-
-public:
/** Sets the format of the framebuffer. Once the format is set, it can't
be changed. */
void set_format(const FrameFormat &);
void update() const;
void check_size();
void set_attachment(FrameAttachment, Texture &, unsigned, int, unsigned);
-public:
+public:
/** 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, Texture2D &, unsigned level = 0);
+
+ void attach(FrameAttachment attch, Texture2DMultisample &);
+
+ /** Attaches a single layer from a 3-dimensional texture to the
+ framebuffer. */
+ void attach(FrameAttachment attch, Texture3D &, unsigned layer, unsigned level = 0);
+
+ void attach(FrameAttachment attch, TextureCube &, TextureCubeFace face, unsigned level = 0);
+
+ /** Attaches a layered texture to the framebuffer. Shaders can direct
+ output to a particular layer. */
+ void attach_layered(FrameAttachment attch, Texture3D &, 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 attach_layered(FrameAttachment attch, TextureCube &, unsigned level = 0);
void detach(FrameAttachment attch);
void resize(const WindowView &);