]> git.tdb.fi Git - libs/gl.git/commitdiff
Helper functions for post-processors
authorMikko Rasa <tdb@tdb.fi>
Mon, 20 Aug 2012 20:27:28 +0000 (23:27 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 20 Aug 2012 20:27:28 +0000 (23:27 +0300)
Most post-processors render fullscreen quads and use a very basic vertex
shader, so it makes sense to provide these as common resources.

source/postprocessor.cpp [new file with mode: 0644]
source/postprocessor.h

diff --git a/source/postprocessor.cpp b/source/postprocessor.cpp
new file mode 100644 (file)
index 0000000..add8b1e
--- /dev/null
@@ -0,0 +1,48 @@
+#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
index 9e4220abd84a24b04330727a18bc0cb8e03deacf..d9489de2c65999a73644df932fe17c26f442d519 100644 (file)
@@ -4,10 +4,14 @@
 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
 {
@@ -16,10 +20,22 @@ protected:
 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