void ImageSampler::DoPixelSampling(UINT32 x, UINT32 y, UINT32 sample_count, PixelSamplingResult& result) { IntersectContext tempCtx; if (mTempSamplingRes.size() < sample_count) mTempSamplingRes.resize(sample_count); float sampleCnt = (float)sample_count; float hitCnt = 0; KColor sum(0,0,0); RenderBuffers* pRBufs = mpInputData->pRenderBuffers; for (UINT32 si = 0; si < sample_count; ++si) { TracingInstance& tracingInst = *mTracingThreadData.get(); tracingInst.mCameraContext.inScreenPos = pRBufs->RS_Image(x, y); float motionTime = ENABLE_MB ? pRBufs->RS_MotionBlur(x, y) : 0; tracingInst.mCameraContext.inMotionTime = motionTime; tracingInst.mCameraContext.inAperturePos = ENABLE_DOF ? pRBufs->RS_DOF(x, y) : KVec2(0,0); KColor out_clr; bool isHit = mpInputData->pCurrentCamera->EvaluateShading(tracingInst, mTempSamplingRes[si]); sum.Add(mTempSamplingRes[si]); mpInputData->pRenderBuffers->IncreaseSampledCount(x, y, 1); if (isHit) hitCnt += 1.0f; } result.alpha = hitCnt / sampleCnt; result.variance = 0; result.average = sum; result.average.Scale(1.0f / sampleCnt); for (UINT32 si = 0; si < sample_count; ++si) { result.variance += mTempSamplingRes[si].DiffRatio(result.average); } result.variance /= sampleCnt; }