--- /dev/null
+#include "mesh.h"
+#include "meshbuilder.h"
+#include "postprocessor.h"
+#include "shader.h"
+
+namespace {
+
+const char fullscreen_vs_source[] =
+ "varying vec2 texcoord;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = gl_Vertex;\n"
+ " texcoord = gl_Vertex.xy*0.5+0.5;\n"
+ "}\n";
+
+}
+
+
+namespace Msp {
+namespace GL {
+
+Shader &PostProcessor::get_fullscreen_vertex_shader()
+{
+ static Shader shader(VERTEX_SHADER, fullscreen_vs_source);
+ return shader;
+}
+
+const Mesh &PostProcessor::get_fullscreen_quad()
+{
+ static const Mesh &mesh = create_fullscreen_quad();
+ return mesh;
+}
+
+const Mesh &PostProcessor::create_fullscreen_quad()
+{
+ static Mesh mesh(GL::VERTEX2);
+ MeshBuilder builder(mesh);
+ builder.begin(TRIANGLE_STRIP);
+ builder.vertex(-1, 1);
+ builder.vertex(-1, -1);
+ builder.vertex(1, 1);
+ builder.vertex(1, -1);
+ builder.end();
+ return mesh;
+}
+
+} // namespace GL
+} // namespace Msp
namespace Msp {
namespace GL {
+class Mesh;
+class Shader;
class Texture2D;
/**
-Base class for post-processing effects.
+Base class for post-processing effects. Post-processors receive the contents
+of the entire framebuffer as a texture and render it back, altering it in the
+process.
*/
class PostProcessor
{
public:
virtual ~PostProcessor() { }
- /**
- Renders the effect. Takes the source texture as a parameter.
- */
- virtual void render(const Texture2D &, const Texture2D &) = 0;
+ /// Renders the effect.
+ virtual void render(const Texture2D &color, const Texture2D &depth) = 0;
+
+protected:
+ /** Returns a vertex shader suitable for rendering a fullscreen quad. Input
+ vertices are assumed to be in normalized device coordinates; no transform is
+ done. The shader provides a varying vec2 texcoord for fragment a shader to
+ access textures. */
+ static Shader &get_fullscreen_vertex_shader();
+
+ /** Returns a mesh consisting of a single quad, covering the entire screen.
+ The vertices are in normalized device coordinates. */
+ static const Mesh &get_fullscreen_quad();
+
+private:
+ static const Mesh &create_fullscreen_quad();
};
} // namespace GL