00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if defined(_MSC_VER)
00025 #pragma once
00026 #endif
00027
00028 #ifndef PBRT_RENDERERS_METROPOLIS_H
00029 #define PBRT_RENDERERS_METROPOLIS_H
00030
00031
00032 #include "pbrt.h"
00033 #include "renderer.h"
00034 #include "parallel.h"
00035 struct MLTSample;
00036 class DirectLightingIntegrator;
00037 struct LightingSample;
00038
00039
00040 struct PathVertex;
00041
00042 class MetropolisRenderer : public Renderer {
00043 public:
00044
00045 MetropolisRenderer(int perPixelSamples, int nBootstrap,
00046 int directPixelSamples, float largeStepProbability,
00047 bool doDirectSeparately, int maxConsecutiveRejects, int maxDepth,
00048 Camera *camera, bool doBidirectional);
00049 ~MetropolisRenderer();
00050 void Render(const Scene *scene);
00051 Spectrum Li(const Scene *scene, const RayDifferential &ray,
00052 const Sample *sample, RNG &rng, MemoryArena &arena,
00053 Intersection *isect = NULL, Spectrum *T = NULL) const;
00054 Spectrum Transmittance(const Scene *scene, const RayDifferential &ray,
00055 const Sample *sample, RNG &rng, MemoryArena &arena) const;
00056 private:
00057
00058 Spectrum PathL(const MLTSample &sample, const Scene *scene,
00059 MemoryArena &arena, const Camera *camera,
00060 const Distribution1D *lightDistribution, PathVertex *cameraPath,
00061 PathVertex *lightPath, RNG &rng) const;
00062 Spectrum Lpath(const Scene *scene, const PathVertex *path, int pathLength,
00063 MemoryArena &arena, const vector<LightingSample> &samples,
00064 RNG &rng, float time, const Distribution1D *lightDistribution,
00065 const RayDifferential &escapedRay, const Spectrum &escapedAlpha) const;
00066 Spectrum Lbidir(const Scene *scene,
00067 const PathVertex *cameraPath, int cameraPathLength,
00068 const PathVertex *lightPath, int lightPathLength,
00069 MemoryArena &arena, const vector<LightingSample> &samples,
00070 RNG &rng, float time, const Distribution1D *lightDistribution,
00071 const RayDifferential &escapedRay, const Spectrum &escapedAlpha) const;
00072
00073
00074 Camera *camera;
00075 bool bidirectional;
00076 uint32_t nDirectPixelSamples, nPixelSamples, maxDepth;
00077 uint32_t largeStepsPerPixel, nBootstrap, maxConsecutiveRejects;
00078 DirectLightingIntegrator *directLighting;
00079 AtomicInt32 nTasksFinished;
00080 friend class MLTTask;
00081 };
00082
00083
00084 MetropolisRenderer *CreateMetropolisRenderer(const ParamSet ¶ms,
00085 Camera *camera);
00086
00087 #endif // PBRT_RENDERERS_METROPOLIS_H