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 #include "sampling.h"
00026 #include "paramset.h"
00027 #include "film.h"
00028
00029 class StratifiedSampler : public Sampler {
00030 public:
00031
00032 StratifiedSampler(int xstart, int xend,
00033 int ystart, int yend,
00034 int xs, int ys, bool jitter);
00035 int RoundSize(int size) const {
00036 return size;
00037 }
00038 ~StratifiedSampler() {
00039 FreeAligned(imageSamples);
00040 }
00041 bool GetNextSample(Sample *sample);
00042 private:
00043
00044 int xPixelSamples, yPixelSamples;
00045 bool jitterSamples;
00046 int xPos, yPos;
00047 float *imageSamples, *lensSamples, *timeSamples;
00048 int samplePos;
00049 };
00050
00051 StratifiedSampler::StratifiedSampler(int xstart, int xend,
00052 int ystart, int yend, int xs, int ys, bool jitter)
00053 : Sampler(xstart, xend, ystart, yend, xs * ys) {
00054 jitterSamples = jitter;
00055 xPos = xPixelStart;
00056 yPos = yPixelStart;
00057 xPixelSamples = xs;
00058 yPixelSamples = ys;
00059
00060 imageSamples = (float *)AllocAligned(5 * xPixelSamples *
00061 yPixelSamples * sizeof(float));
00062 lensSamples =
00063 imageSamples + 2 * xPixelSamples * yPixelSamples;
00064 timeSamples =
00065 lensSamples + 2 * xPixelSamples * yPixelSamples;
00066
00067 StratifiedSample2D(imageSamples,
00068 xPixelSamples, yPixelSamples,
00069 jitterSamples);
00070 StratifiedSample2D(lensSamples,
00071 xPixelSamples, yPixelSamples,
00072 jitterSamples);
00073 StratifiedSample1D(timeSamples, xPixelSamples*yPixelSamples,
00074 jitterSamples);
00075
00076 for (int o = 0;
00077 o < 2 * xPixelSamples * yPixelSamples;
00078 o += 2) {
00079 imageSamples[o] += xPos;
00080 imageSamples[o+1] += yPos;
00081 }
00082
00083 Shuffle(lensSamples, xPixelSamples*yPixelSamples, 2);
00084 Shuffle(timeSamples, xPixelSamples*yPixelSamples, 1);
00085 samplePos = 0;
00086 }
00087 bool StratifiedSampler::GetNextSample(Sample *sample) {
00088
00089 if (samplePos == xPixelSamples * yPixelSamples) {
00090
00091 if (++xPos == xPixelEnd) {
00092 xPos = xPixelStart;
00093 ++yPos;
00094 }
00095 if (yPos == yPixelEnd)
00096 return false;
00097
00098 StratifiedSample2D(imageSamples,
00099 xPixelSamples, yPixelSamples,
00100 jitterSamples);
00101 StratifiedSample2D(lensSamples,
00102 xPixelSamples, yPixelSamples,
00103 jitterSamples);
00104 StratifiedSample1D(timeSamples, xPixelSamples*yPixelSamples,
00105 jitterSamples);
00106
00107 for (int o = 0;
00108 o < 2 * xPixelSamples * yPixelSamples;
00109 o += 2) {
00110 imageSamples[o] += xPos;
00111 imageSamples[o+1] += yPos;
00112 }
00113
00114 Shuffle(lensSamples, xPixelSamples*yPixelSamples, 2);
00115 Shuffle(timeSamples, xPixelSamples*yPixelSamples, 1);
00116 samplePos = 0;
00117 }
00118
00119 sample->imageX = imageSamples[2*samplePos];
00120 sample->imageY = imageSamples[2*samplePos+1];
00121 sample->lensU = lensSamples[2*samplePos];
00122 sample->lensV = lensSamples[2*samplePos+1];
00123 sample->time = timeSamples[samplePos];
00124
00125 for (u_int i = 0; i < sample->n1D.size(); ++i)
00126 LatinHypercube(sample->oneD[i], sample->n1D[i], 1);
00127 for (u_int i = 0; i < sample->n2D.size(); ++i)
00128 LatinHypercube(sample->twoD[i], sample->n2D[i], 2);
00129 ++samplePos;
00130 return true;
00131 }
00132 extern "C" DLLEXPORT Sampler *CreateSampler(const ParamSet ¶ms, const Film *film) {
00133 bool jitter = params.FindOneBool("jitter", true);
00134
00135 int xstart, xend, ystart, yend;
00136 film->GetSampleExtent(&xstart, &xend, &ystart, ¥d);
00137 int xsamp = params.FindOneInt("xsamples", 2);
00138 int ysamp = params.FindOneInt("ysamples", 2);
00139 return new StratifiedSampler(xstart, xend, ystart, yend, xsamp, ysamp,
00140 jitter);
00141 }