00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdafx.h"
00027 #include "samplers/stratified.h"
00028 #include "paramset.h"
00029 #include "camera.h"
00030 #include "montecarlo.h"
00031
00032
00033 StratifiedSampler::StratifiedSampler(int xstart, int xend,
00034 int ystart, int yend, int xs, int ys, bool jitter,
00035 float sopen, float sclose)
00036 : Sampler(xstart, xend, ystart, yend, xs * ys, sopen, sclose) {
00037 jitterSamples = jitter;
00038 xPos = xPixelStart;
00039 yPos = yPixelStart;
00040 xPixelSamples = xs;
00041 yPixelSamples = ys;
00042 sampleBuf = new float[5 * xPixelSamples * yPixelSamples];
00043 }
00044
00045
00046 StratifiedSampler::~StratifiedSampler() {
00047 delete[] sampleBuf;
00048 }
00049
00050
00051 Sampler *StratifiedSampler::GetSubSampler(int num, int count) {
00052 int x0, x1, y0, y1;
00053 ComputeSubWindow(num, count, &x0, &x1, &y0, &y1);
00054 if (x0 == x1 || y0 == y1) return NULL;
00055 return new StratifiedSampler(x0, x1, y0, y1, xPixelSamples,
00056 yPixelSamples, jitterSamples, shutterOpen, shutterClose);
00057 }
00058
00059
00060 int StratifiedSampler::GetMoreSamples(Sample *samples, RNG &rng) {
00061 if (yPos == yPixelEnd) return 0;
00062 int nSamples = xPixelSamples * yPixelSamples;
00063
00064
00065
00066 float *bufp = sampleBuf;
00067 float *imageSamples = bufp; bufp += 2 * nSamples;
00068 float *lensSamples = bufp; bufp += 2 * nSamples;
00069 float *timeSamples = bufp;
00070 StratifiedSample2D(imageSamples, xPixelSamples, yPixelSamples, rng,
00071 jitterSamples);
00072 StratifiedSample2D(lensSamples, xPixelSamples, yPixelSamples, rng,
00073 jitterSamples);
00074 StratifiedSample1D(timeSamples, xPixelSamples * yPixelSamples, rng,
00075 jitterSamples);
00076
00077
00078 for (int o = 0; o < 2 * xPixelSamples * yPixelSamples; o += 2) {
00079 imageSamples[o] += xPos;
00080 imageSamples[o+1] += yPos;
00081 }
00082
00083
00084 Shuffle(lensSamples, xPixelSamples*yPixelSamples, 2, rng);
00085 Shuffle(timeSamples, xPixelSamples*yPixelSamples, 1, rng);
00086
00087
00088 for (int i = 0; i < nSamples; ++i) {
00089 samples[i].imageX = imageSamples[2*i];
00090 samples[i].imageY = imageSamples[2*i+1];
00091 samples[i].lensU = lensSamples[2*i];
00092 samples[i].lensV = lensSamples[2*i+1];
00093 samples[i].time = Lerp(timeSamples[i], shutterOpen, shutterClose);
00094
00095 for (uint32_t j = 0; j < samples[i].n1D.size(); ++j)
00096 LatinHypercube(samples[i].oneD[j], samples[i].n1D[j], 1, rng);
00097 for (uint32_t j = 0; j < samples[i].n2D.size(); ++j)
00098 LatinHypercube(samples[i].twoD[j], samples[i].n2D[j], 2, rng);
00099 }
00100
00101
00102 if (++xPos == xPixelEnd) {
00103 xPos = xPixelStart;
00104 ++yPos;
00105 }
00106 return nSamples;
00107 }
00108
00109
00110 StratifiedSampler *CreateStratifiedSampler(const ParamSet ¶ms, const Film *film,
00111 const Camera *camera) {
00112 bool jitter = params.FindOneBool("jitter", true);
00113
00114 int xstart, xend, ystart, yend;
00115 film->GetSampleExtent(&xstart, &xend, &ystart, ¥d);
00116 int xsamp = params.FindOneInt("xsamples", 2);
00117 int ysamp = params.FindOneInt("ysamples", 2);
00118 if (PbrtOptions.quickRender) xsamp = ysamp = 1;
00119 return new StratifiedSampler(xstart, xend, ystart, yend, xsamp, ysamp,
00120 jitter, camera->shutterOpen, camera->shutterClose);
00121 }
00122
00123