コード例 #1
0
ファイル: tracing_thread.cpp プロジェクト: Kai-Fu/KRender
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;
}