X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Feffects%2Fambientocclusion.cpp;h=6ba51853d6d288814bd716fbb76881d13e8185af;hb=866c80e19e66d6dd8d49ec48d9be54a3a7fe07a2;hp=b4050aef92428ceeacf44a8924e4a48d07085279;hpb=f4e0bcd917fd4270100e219c5fba7af185060111;p=libs%2Fgl.git diff --git a/source/effects/ambientocclusion.cpp b/source/effects/ambientocclusion.cpp index b4050aef..6ba51853 100644 --- a/source/effects/ambientocclusion.cpp +++ b/source/effects/ambientocclusion.cpp @@ -5,7 +5,6 @@ #include "renderer.h" #include "resources.h" #include "shader.h" -#include "tests.h" using namespace std; @@ -41,11 +40,10 @@ const Texture2D &AmbientOcclusion::get_or_create_rotate_lookup() rotate_lookup->storage(RGBA8, 4, 4, 1); resources.add(name, rotate_lookup); - unsigned seed = 1; unsigned char data[64]; for(unsigned i=0; i<16; ++i) { - Geometry::Angle a = Geometry::Angle::from_turns(random(seed)); + Geometry::Angle a = Geometry::Angle::from_turns(i*7/16.0f); unsigned char c = (cos(a)*0.5f+0.5f)*255; unsigned char s = (sin(a)*0.5f+0.5f)*255; data[i*4 ] = c; @@ -58,25 +56,27 @@ const Texture2D &AmbientOcclusion::get_or_create_rotate_lookup() return *rotate_lookup; } -float AmbientOcclusion::random(unsigned &seed) +float AmbientOcclusion::radical_inverse(unsigned n) { - static const unsigned modulus = (1U<<31)-1; - seed = (static_cast(seed)*48271)%modulus; // minstd - return static_cast(seed)/(modulus-1); + unsigned inv = ((n&0x55)<<1) | ((n&0xAA)>>1); + inv = ((inv&0x33)<<2) | ((inv&0xCC)>>2); + inv = ((inv&0x0F)<<4) | ((inv&0xF0)>>4); + return inv/256.0f; } void AmbientOcclusion::set_n_samples(unsigned n) { - if(n<1 || n>32) + if(n<1 || n>128) throw out_of_range("AmbientOcclusion::set_n_samples"); - unsigned seed = 1; - float radius_divisor = (n-1)*(n-1); - Vector3 sample_points[32]; + vector sample_points(n); for(unsigned i=0; i(i)/n; + float z = sqrt(1.0f-r*r); + float d = radical_inverse(i); + Geometry::Angle a = Geometry::Angle::from_turns(d); + sample_points[i] = Vector3(cos(a)*r, sin(a)*r, z)*(0.1f+0.9f*d*d); } shdata.uniform3_array("sample_points", n, &sample_points[0].x); shdata.uniform("n_samples", static_cast(n)); @@ -99,6 +99,8 @@ void AmbientOcclusion::set_edge_depth_threshold(float edt) void AmbientOcclusion::render(Renderer &renderer, const Texture2D &color, const Texture2D &depth) { + const Framebuffer *out_fbo = renderer.get_framebuffer(); + Renderer::Push push(renderer); renderer.set_texture("source", &color, &nearest_clamp_sampler); renderer.set_texture("depth", &depth, &nearest_clamp_sampler); @@ -106,15 +108,24 @@ void AmbientOcclusion::render(Renderer &renderer, const Texture2D &color, const renderer.set_texture("rotate", &rotate_lookup, &nearest_sampler); renderer.set_shader_program(&occlude_shader, &shdata); - { - BindRestore bind_fbo(occlude_target.get_framebuffer()); - quad.draw(renderer); - } + renderer.set_framebuffer(&occlude_target.get_framebuffer()); + quad.draw(renderer); + renderer.set_framebuffer(out_fbo); renderer.set_shader_program(&combine_shader); quad.draw(renderer); } +void AmbientOcclusion::set_debug_name(const string &name) +{ +#ifdef DEBUG + occlude_target.set_debug_name(name+" [RT]"); + shdata.set_debug_name(name+" [UBO]"); +#else + (void)name; +#endif +} + AmbientOcclusion::Template::Template(): n_samples(16),