Abstract sample generator. More...
#include <sampler.h>
Public Member Functions | |
virtual | ~Sampler () |
Release all memory. | |
virtual std::unique_ptr< Sampler > | clone () const =0 |
Create an exact clone of the current instance. | |
virtual void | prepare (const ImageBlock &block)=0 |
Prepare to render a new image block. More... | |
virtual void | generate ()=0 |
Prepare to generate new samples. More... | |
virtual void | advance ()=0 |
Advance to the next sample. | |
virtual float | next1D ()=0 |
Retrieve the next component value from the current sample. | |
virtual Point2f | next2D ()=0 |
Retrieve the next two component values from the current sample. | |
virtual size_t | getSampleCount () const |
Return the number of configured pixel samples. | |
virtual EClassType | getClassType () const override |
Return the type of object (i.e. Mesh/Sampler/etc.) provided by this instance. | |
Public Member Functions inherited from NoriObject | |
virtual | ~NoriObject () |
Virtual destructor. | |
virtual void | addChild (NoriObject *child) |
Add a child object to the current instance. More... | |
virtual void | setParent (NoriObject *parent) |
Set the parent object. More... | |
virtual void | activate () |
Perform some action associated with the object. More... | |
virtual std::string | toString () const =0 |
Return a brief string summary of the instance (for debugging purposes) | |
void | setIdName (const std::string &name) |
Allow to assign a name to the object. | |
const std::string & | getIdName () const |
Protected Attributes | |
size_t | m_sampleCount |
Protected Attributes inherited from NoriObject | |
std::string | m_idname |
Additional Inherited Members | |
Public Types inherited from NoriObject | |
enum | EClassType { EScene = 0 , EMesh , ETexture , EBSDF , EPhaseFunction , EEmitter , EMedium , ECamera , EIntegrator , ESampler , ETest , EReconstructionFilter , EClassTypeCount } |
Static Public Member Functions inherited from NoriObject | |
static std::string | classTypeName (EClassType type) |
Turn a class type into a human-readable string. | |
Abstract sample generator.
A sample generator is responsible for generating the random number stream that will be passed an Integrator implementation as it computes the radiance incident along a specified ray.
The most simple conceivable sample generator is just a wrapper around the Mersenne-Twister random number generator and is implemented in independent.cpp
(it is named this way because it generates statistically independent random numbers).
Fancier samplers might use stratification or low-discrepancy sequences (e.g. Halton, Hammersley, or Sobol point sets) for improved convergence. Another use of this class is in producing intentionally correlated random numbers, e.g. as part of a Metropolis-Hastings integration scheme.
The general interface between a sampler and a rendering algorithm is as follows: Before beginning to render a pixel, the rendering algorithm calls generate(). The first pixel sample can now be computed, after which advance() needs to be invoked. This repeats until all pixel samples have been exhausted. While computing a pixel sample, the rendering algorithm requests (pseudo-) random numbers using the next1D() and next2D() functions.
Conceptually, the right way of thinking of this goes as follows: For each sample in a pixel, a sample generator produces a (hypothetical) point in an infinite dimensional random number hypercube. A rendering algorithm can then request subsequent 1D or 2D components of this point using the next1D() and next2D() functions. Fancy implementations of this class make certain guarantees about the stratification of the first n components with respect to the other points that are sampled within a pixel.
|
pure virtual |
Prepare to generate new samples.
This function is called initially and every time the integrator starts rendering a new pixel.
Implemented in Independent.
|
pure virtual |
Prepare to render a new image block.
This function is called when the sampler begins rendering a new image block. This can be used to deterministically initialize the sampler so that repeated program runs always create the same image.
Implemented in Independent.