--- /dev/null
+#ifndef MSP_GL_BLEND_H_
+#define MSP_GL_BLEND_H_
+
+#include <msp/strings/lexicalcast.h>
+#include "bindable.h"
+#include "gl.h"
+#include <msp/gl/extensions/ext_blend_minmax.h>
+
+namespace Msp {
+namespace GL {
+
+enum BlendEquation
+{
+ ADD = GL_FUNC_ADD,
+ SUBTRACT = GL_FUNC_SUBTRACT,
+ REVERSE_SUBTRACT = GL_FUNC_REVERSE_SUBTRACT,
+ MIN = GL_MIN,
+ MAX = GL_MAX
+};
+
+enum BlendFactor
+{
+ ZERO = GL_ZERO,
+ ONE = GL_ONE,
+ SRC_COLOR = GL_SRC_COLOR,
+ ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR,
+ SRC_ALPHA = GL_SRC_ALPHA,
+ ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA,
+ DST_COLOR = GL_DST_COLOR,
+ ONE_MINUS_DST_COLOR = GL_ONE_MINUS_DST_COLOR,
+ DST_ALPHA = GL_DST_ALPHA,
+ ONE_MINUS_DST_ALPHA = GL_ONE_MINUS_DST_ALPHA,
+ CONSTANT_COLOR = GL_CONSTANT_COLOR,
+ ONE_MINUS_CONSTANT_COLOR = GL_ONE_MINUS_CONSTANT_COLOR,
+ CONSTANT_ALPHA = GL_CONSTANT_ALPHA,
+ ONE_MINUS_CONSTANT_ALPHA = GL_ONE_MINUS_CONSTANT_ALPHA
+};
+
+/**
+Blends incoming fragments with those already in the framebuffer.
+*/
+class Blend: public Bindable<Blend>
+{
+private:
+ BlendEquation eq;
+ BlendFactor src_factor;
+ BlendFactor dst_factor;
+
+public:
+ Blend();
+ Blend(BlendFactor, BlendFactor);
+ Blend(BlendEquation, BlendFactor, BlendFactor);
+
+ void bind() const;
+
+ static void unbind();
+
+ static const Blend &alpha();
+ static const Blend &additive();
+ static const Blend &additive_alpha();
+};
+
+void operator>>(const LexicalConverter &, BlendFactor &);
+void operator<<(LexicalConverter &, BlendFactor);
+
+} // namespace GL
+} // namespace Msp
+
+#endif