2 #include <msp/gl/mesh.h>
3 #include <msp/gl/renderer.h>
4 #include <msp/gl/texture2d.h>
13 Vignette::Vignette(float aspect):
14 mesh(get_fullscreen_quad()),
15 shprog(Resources::get_builtins().get<GL::Program>("vignette.glsl"))
17 shdata.uniform("coord_scale", min(aspect, 1.0f), min(1.0f/aspect, 1.0f));
18 set_optical(1.0f, 0.5f);
19 set_natural(1.0f, 1.0f);
22 void Vignette::set_optical(float pupil, float aperture)
24 if(pupil<0.0f || aperture<0.0f || aperture>pupil)
25 throw std::invalid_argument("Vignette::set_optical");
27 float p_sq = pupil*pupil;
28 float a_sq = aperture*aperture;
29 float two_ap = 2*pupil*aperture;
30 static const float pi = Geometry::Angle<float>::straight().radians();
31 shdata.uniform("optical", pupil, aperture, a_sq, a_sq*pi);
32 shdata.uniform("optical_range", p_sq-two_ap+a_sq, p_sq+two_ap+a_sq);
35 void Vignette::set_natural(float radius, float darkening)
37 if(radius<=0.0f || darkening<0.0f)
38 throw std::invalid_argument("Vignette::set_natural");
40 float v = pow(2.0f, -darkening);
41 float t_sq = 1/sqrt(v)-1;
42 shdata.uniform("natural", t_sq/(radius*radius));
45 void Vignette::render(GL::Renderer &renderer, const GL::Texture2D &color, const GL::Texture2D &)
47 renderer.set_texture(&color);
48 renderer.set_shader_program(&shprog, &shdata);
53 Vignette::Template::Template():
60 Vignette *Vignette::Template::create(unsigned w, unsigned h) const
62 Vignette *vign = new Vignette(static_cast<float>(w)/h);
63 vign->set_optical(pupil, aperture);
64 vign->set_natural(radius, darkening);
69 Vignette::Template::Loader::Loader(Template &t):
70 DerivedObjectLoader<Template, PostProcessor::Template::Loader>(t)
72 add("optical", &Template::pupil, &Template::aperture);
73 add("natural", &Template::radius, &Template::darkening);
76 } // namespace DemoScene