KVec2 TracingInstance::GetAreaLightSample(UINT32 lightIdx, UINT32 sampleIdx) const { if (mIsPixelSampling) return mpRenderBuffers->RS_AreaLight(mCurPixel_X, mCurPixel_Y, lightIdx, sampleIdx); else { KVec2 min(0, 0); KVec2 max(1, 1); KVec2 hPt; Sampling::Halton2D(&hPt, lightIdx*AREA_LIGHT_SAMP_CNT + sampleIdx, 1, KVec2(0,0), min, max); return KVec2(Rand_0_1(), Rand_0_1()); } }
void TracingInstance::ConvertToTransContext(const IntersectContext& hitCtx, const ShadingContext& shadingCtx, TransContext& transCtx) { *transCtx.lightVec = shadingCtx.out_vec; *transCtx.normal = shadingCtx.normal; *transCtx.tangent = shadingCtx.tangent.tangent; *transCtx.binormal = shadingCtx.tangent.binormal; *transCtx.uv = shadingCtx.hasUV ? shadingCtx.uv.uv : KVec2(0,0); }
void TracingInstance::ConvertToSurfaceContext(const IntersectContext& hitCtx, const ShadingContext& shadingCtx, SurfaceContext& surfaceCtx) { surfaceCtx.tracerDataLocal.hit_ctx = &hitCtx; surfaceCtx.tracerDataLocal.shading_ctx = &shadingCtx; surfaceCtx.tracerDataLocal.tracing_inst = this; surfaceCtx.tracerDataLocal.iter_light_li = 0; surfaceCtx.tracerDataLocal.iter_light_si = 0; *surfaceCtx.outVec = shadingCtx.out_vec; *surfaceCtx.normal = shadingCtx.normal; *surfaceCtx.tangent = shadingCtx.tangent.tangent; *surfaceCtx.binormal = shadingCtx.tangent.binormal; *surfaceCtx.uv = shadingCtx.hasUV ? shadingCtx.uv.uv : KVec2(0,0); }
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; }