namespace GL {
AmbientOcclusion::AmbientOcclusion(unsigned w, unsigned h, float):
- occlude_target(w, h, (RENDER_COLOR,RGB)),
+ occlude_target(w, h, (RENDER_COLOR,RED)),
occlude_shader("ambientocclusion_occlude.glsl"),
combine_shader("ambientocclusion_combine.glsl"),
quad(get_fullscreen_quad())
Geometry::Angle<float> a = Geometry::Angle<float>::from_turns(random(seed));
unsigned char c = (cos(a)*0.5f+0.5f)*255;
unsigned char s = (sin(a)*0.5f+0.5f)*255;
- data[i*3 ] = c;
- data[i*3+1] = s;
- data[i*3+2] = 255-s;
- data[i*3+4] = ((i+i/4)%2)*255;
+ data[i*4 ] = c;
+ data[i*4+1] = s;
+ data[i*4+2] = 255-s;
+ data[i*4+3] = ((i+i/4)%2)*255;
}
rotate_lookup.image(0, RGBA, UNSIGNED_BYTE, data);
set_n_samples(16);
set_occlusion_radius(0.5f);
set_darkness(1.0f);
+ set_edge_depth_threshold(0.1f);
}
float AmbientOcclusion::random(unsigned &seed)
shdata.uniform("occlusion_radius", r);
}
-void AmbientOcclusion::set_depth_ratio(float)
+void AmbientOcclusion::set_darkness(float darkness)
{
+ shdata.uniform("darkness", darkness);
}
-void AmbientOcclusion::set_darkness(float darkness)
+void AmbientOcclusion::set_edge_depth_threshold(float edt)
{
- shdata.uniform("darkness", darkness);
+ shdata.uniform("edge_depth_threshold", edt);
}
void AmbientOcclusion::render(Renderer &renderer, const Texture2D &color, const Texture2D &depth)
AmbientOcclusion::Template::Template():
n_samples(16),
occlusion_radius(0.5f),
- darkness(1.0f)
+ darkness(1.0f),
+ edge_depth_threshold(0.1f)
{ }
AmbientOcclusion *AmbientOcclusion::Template::create(unsigned width, unsigned height) const
ao->set_n_samples(n_samples);
ao->set_occlusion_radius(occlusion_radius);
ao->set_darkness(darkness);
+ ao->set_edge_depth_threshold(edge_depth_threshold);
return ao.release();
}
DataFile::DerivedObjectLoader<Template, PostProcessor::Template::Loader>(t)
{
add("darkness", &Template::darkness);
+ add("edge_depth_threshold", &Template::edge_depth_threshold);
add("occlusion_radius", &Template::occlusion_radius);
add("samples", &Template::n_samples);
}