vec2 sample_coord = texcoord+offset*tex_scale;
float occ = texture(occlusion, sample_coord).r;
float sample = texture(depth, sample_coord).r;
- float z_range = occlusion_radius*length(offset)*0.1;
+ float z_range = occlusion_radius*length(offset)*edge_depth_threshold;
float min_depth = project(vec3(center.xy, center.z+z_range)).z;
float max_depth = project(vec3(center.xy, center.z-z_range)).z;
if(sample>=min_depth && sample<=max_depth)
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("darkness", darkness);
}
+void AmbientOcclusion::set_edge_depth_threshold(float edt)
+{
+ shdata.uniform("edge_depth_threshold", edt);
+}
+
void AmbientOcclusion::render(Renderer &renderer, const Texture2D &color, const Texture2D &depth)
{
texturing.attach(0, color);
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);
}
unsigned n_samples;
float occlusion_radius;
float darkness;
+ float edge_depth_threshold;
Template();
public:
void set_n_samples(unsigned);
void set_occlusion_radius(float);
+ void set_edge_depth_threshold(float);
// Deprecated
void set_depth_ratio(float);