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/random.h"
00028 #include "montecarlo.h"
00029 #include "camera.h"
00030
00031 RandomSampler::RandomSampler(int xstart, int xend,
00032 int ystart, int yend, int ns, float sopen, float sclose)
00033 : Sampler(xstart, xend, ystart, yend, ns, sopen, sclose) {
00034 xPos = xPixelStart;
00035 yPos = yPixelStart;
00036 nSamples = ns;
00037
00038 imageSamples = AllocAligned<float>(5 * nSamples);
00039 lensSamples = imageSamples + 2 * nSamples;
00040 timeSamples = lensSamples + 2 * nSamples;
00041
00042 RNG rng(xstart + ystart * (xend-xstart));
00043 for (int i = 0; i < 5 * nSamples; ++i)
00044 imageSamples[i] = rng.RandomFloat();
00045
00046
00047 for (int o = 0; o < 2 * nSamples; o += 2) {
00048 imageSamples[o] += xPos;
00049 imageSamples[o+1] += yPos;
00050 }
00051 samplePos = 0;
00052 }
00053
00054
00055
00056 Sampler *RandomSampler::GetSubSampler(int num, int count) {
00057 int x0, x1, y0, y1;
00058 ComputeSubWindow(num, count, &x0, &x1, &y0, &y1);
00059 if (x0 == x1 || y0 == y1) return NULL;
00060 return new RandomSampler(x0, x1, y0, y1, nSamples,
00061 shutterOpen, shutterClose);
00062 }
00063
00064
00065
00066 int RandomSampler::GetMoreSamples(Sample *sample, RNG &rng) {
00067 if (samplePos == nSamples) {
00068 if (xPixelStart == xPixelEnd || yPixelStart == yPixelEnd)
00069 return 0;
00070 if (++xPos == xPixelEnd) {
00071 xPos = xPixelStart;
00072 ++yPos;
00073 }
00074 if (yPos == yPixelEnd)
00075 return 0;
00076
00077 for (int i = 0; i < 5 * nSamples; ++i)
00078 imageSamples[i] = rng.RandomFloat();
00079
00080
00081 for (int o = 0; o < 2 * nSamples; o += 2) {
00082 imageSamples[o] += xPos;
00083 imageSamples[o+1] += yPos;
00084 }
00085 samplePos = 0;
00086 }
00087
00088 sample->imageX = imageSamples[2*samplePos];
00089 sample->imageY = imageSamples[2*samplePos+1];
00090 sample->lensU = lensSamples[2*samplePos];
00091 sample->lensV = lensSamples[2*samplePos+1];
00092 sample->time = Lerp(timeSamples[samplePos], shutterOpen, shutterClose);
00093
00094 for (uint32_t i = 0; i < sample->n1D.size(); ++i)
00095 for (uint32_t j = 0; j < sample->n1D[i]; ++j)
00096 sample->oneD[i][j] = rng.RandomFloat();
00097 for (uint32_t i = 0; i < sample->n2D.size(); ++i)
00098 for (uint32_t j = 0; j < 2*sample->n2D[i]; ++j)
00099 sample->twoD[i][j] = rng.RandomFloat();
00100 ++samplePos;
00101 return 1;
00102 }
00103
00104
00105
00106 Sampler *CreateRandomSampler(const ParamSet ¶ms,
00107 const Film *film, const Camera *camera) {
00108 int ns = params.FindOneInt("nsamples", 4);
00109 int xstart, xend, ystart, yend;
00110 film->GetSampleExtent(&xstart, &xend, &ystart, ¥d);
00111 return new RandomSampler(xstart, xend, ystart, yend, ns,
00112 camera->shutterOpen, camera->shutterClose);
00113 }
00114
00115