Click on the filename to display or download the file.
glossy_reflection_sample.mi
declare shader
color "glossy_reflection_sample" (
scalar "shiny" default 5,
integer "samples" default 8 )
version 1
apply material
end declare
glossy_reflection_sample.c
#include "shader.h"
#include "miaux.h"
struct glossy_reflection_sample {
miScalar shiny;
miInteger samples;
};
DLLEXPORT
int glossy_reflection_sample_version(void) { return 1; }
DLLEXPORT
miBoolean glossy_reflection_sample (
miColor *result, miState *state, struct glossy_reflection_sample *params )
{
miScalar shiny = *mi_eval_scalar(¶ms->shiny);
miUint samples = *mi_eval_integer(¶ms->samples);
miVector reflect_dir;
miColor reflect_color;
int sample_number = 0;
double sampled_dir[2];
result->r = result->g = result->b = 0.0;
while (mi_sample(sampled_dir, &sample_number, state, 2, &samples)) {
mi_reflection_dir_glossy_x(&reflect_dir, state, shiny, sampled_dir);
if (!mi_trace_reflection(&reflect_color, state, &reflect_dir))
mi_trace_environment(&reflect_color, state, &reflect_dir);
miaux_add_color(result, &reflect_color);
}
miaux_scale_color(result, 1.0 / (double)samples);
return miTRUE;
}
glossy_reflection_sample_util.c
void miaux_add_color(miColor *result, miColor *c)
{
result->r += c->r;
result->g += c->g;
result->b += c->b;
result->a += c->a;
}
void miaux_scale_color(miColor *result, miScalar scale)
{
result->r *= scale;
result->g *= scale;
result->b *= scale;
}
22 April 2008 23:40:18