Click on the filename to display or download the file.
ambient_occlusion.mi
declare shader
color "ambient_occlusion" (
integer "samples" default 8 )
version 1
apply material
end declare
ambient_occlusion.c
#include "shader.h"
#include "miaux.h"
struct ambient_occlusion {
miUint samples;
};
DLLEXPORT
int ambient_occlusion_version(void) {return(1);}
DLLEXPORT
miBoolean ambient_occlusion (
miColor *result, miState *state, struct ambient_occlusion *params )
{
miUint samples = *mi_eval_integer(¶ms->samples);
miVector trace_direction;
int object_hit = 0, sample_number = 0;
double sample[2], hit_fraction, ambient_exposure;
while (mi_sample(sample, &sample_number, state, 2, &samples)) {
mi_reflection_dir_diffuse_x(&trace_direction, state, sample);
if (mi_trace_probe(state, &trace_direction, &state->point))
object_hit++;
}
hit_fraction = ((double)object_hit / (double)samples);
ambient_exposure = 1.0 - hit_fraction;
result->r = result->g = result->b = ambient_exposure;
result->a = 1.0;
return miTRUE;
}
22 April 2008 23:40:28