X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpostprocessor.cpp;h=6af069e97df613c76fda5a4ed8399b88c4e69b87;hp=28ae71b0945b2ca28e04cf3de34d60e222a36646;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=18240e2bb031551e9c72a55c7d974904d209760a diff --git a/source/postprocessor.cpp b/source/postprocessor.cpp index 28ae71b0..6af069e9 100644 --- a/source/postprocessor.cpp +++ b/source/postprocessor.cpp @@ -1,53 +1,63 @@ #include "mesh.h" #include "meshbuilder.h" #include "postprocessor.h" +#include "sampler.h" #include "shader.h" -namespace { - -const char fullscreen_vs_source[] = - "attribute vec4 vertex;\n" - "varying vec2 texcoord;\n" - "void main()\n" - "{\n" - " gl_Position = vertex;\n" - " texcoord = vertex.xy*0.5+0.5;\n" - "}\n"; - -} - - namespace Msp { namespace GL { +WeakPtr PostProcessor::fullscreen_quad; +WeakPtr PostProcessor::nearest_sampler; +WeakPtr PostProcessor::linear_sampler; + void PostProcessor::render(Renderer &, const Texture2D &color, const Texture2D &depth) { render(color, depth); } -Shader &PostProcessor::get_fullscreen_vertex_shader() +RefPtr PostProcessor::get_fullscreen_quad() { - static VertexShader shader(fullscreen_vs_source); - return shader; + RefPtr mesh = fullscreen_quad; + if(!mesh) + { + mesh = new Mesh(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(); + fullscreen_quad = mesh; + } + return mesh; } -const Mesh &PostProcessor::get_fullscreen_quad() +RefPtr PostProcessor::get_nearest_sampler() { - static const Mesh &mesh = create_fullscreen_quad(); - return mesh; + RefPtr sampler = nearest_sampler; + if(!sampler) + { + sampler = new Sampler; + sampler->set_filter(NEAREST); + sampler->set_wrap(CLAMP_TO_EDGE); + nearest_sampler = sampler; + } + return sampler; } -const Mesh &PostProcessor::create_fullscreen_quad() +RefPtr PostProcessor::get_linear_sampler() { - static Mesh mesh(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; + RefPtr sampler = linear_sampler; + if(!sampler) + { + sampler = new Sampler; + sampler->set_filter(LINEAR); + sampler->set_wrap(CLAMP_TO_EDGE); + linear_sampler = sampler; + } + return sampler; }