create_cdf
On this page | * Overview * Usage * Examples |
---|
Overview
overview
CDFs are useful when sampling from distributions. For example, you could create a CDF of light source power. This would allow sampling of lights with a probability based on power. This is an example of a discrete CDF, where sampling selects among a fixed set of probabilities. (See the example below.)
Use the sample_cdf function to sample values from the returned CDF array.
Usage
usage
float [] create_cdf(float pdf[])
Returns a CDF for the input PDF as an array of floats.
pdf
Array of PDF values to create the CDF for.
Examples
examples
// Iterate over all lights, sampling their powerint[] li = getlights();float values[];resize(values, len(li));int nsamples = 256;int sid = israytrace ? SID : newsampler();vector s, pos, clr;float scale;for (int i = 0; i < len(li); i++){ for (int j = 0; j < nsamples; j++) { nextsample(sid, s.x, s.y, "mode", "nextpixel"); sample_light(li[i], P, s, Time, pos, clr, scale); values[i] += luminance(clr); } values[i] /= nsamples;}
// Create a CDF of the power distributionfloat cdf[] = create_cdf(values);
// Randomly select a light based on power distributionnextsample(sid, s.x, s.y, "mode", "nextpixel");int index = 0;sample_cdf(cdf, s.x, index);
// Do something with the selected light// li[index] ...