float EquirectangularCamera::directionPdf(const PositionSample &/*point*/, const DirectionSample &direction) const { float sinTheta; directionToUV(direction.d, sinTheta); return INV_PI*INV_TWO_PI/sinTheta; }
float CubemapCamera::directionPdf(const PositionSample &/*point*/, const DirectionSample &direction) const { float pdf; directionToUV(direction.d, pdf); return pdf; }
bool EquirectangularCamera::evalDirection(PathSampleGenerator &/*sampler*/, const PositionSample &/*point*/, const DirectionSample &direction, Vec3f &weight, Vec2f &pixel) const { float sinTheta; Vec2f uv = directionToUV(direction.d, sinTheta); pixel = uv/_pixelSize; weight = Vec3f(INV_PI*INV_TWO_PI/(sinTheta*_pixelSize.x()*_pixelSize.y())); return true; }
bool CubemapCamera::evalDirection(PathSampleGenerator &/*sampler*/, const PositionSample &/*point*/, const DirectionSample &direction, Vec3f &weight, Vec2f &pixel) const { float pdf; Vec2f uv = directionToUV(direction.d, pdf); pixel = uv/_pixelSize; weight = Vec3f(pdf*_visibleArea); return true; }
bool EquirectangularCamera::sampleDirect(const Vec3f &p, PathSampleGenerator &/*sampler*/, LensSample &sample) const { sample.d = _pos - p; float rSq = sample.d.lengthSq(); sample.dist = std::sqrt(rSq); sample.d /= sample.dist; float sinTheta; Vec2f uv = directionToUV(-sample.d, sinTheta); sample.pixel = uv/_pixelSize; sample.weight = Vec3f(INV_PI*INV_TWO_PI/(sinTheta*_pixelSize.x()*_pixelSize.y()*rSq)); return true; }
bool CubemapCamera::sampleDirect(const Vec3f &p, PathSampleGenerator &/*sampler*/, LensSample &sample) const { sample.d = _pos - p; float pdf; Vec2f uv = directionToUV(-sample.d, pdf); sample.pixel = uv/_pixelSize; sample.weight = Vec3f(pdf*_visibleArea); float rSq = sample.d.lengthSq(); sample.dist = std::sqrt(rSq); sample.d /= sample.dist; sample.weight /= rSq; return true; }