 			m_mtxs.init(sizeof(aten::mat4) * AT_COUNTOF(mtxs));
 			m_mtxs.writeByNum(mtxs, AT_COUNTOF(mtxs));
 
-			temporarlReprojection << <grid, block >> > (
+			temporalReprojection << <grid, block >> > (
 			//temporarlReprojection << <1, 1 >> > (
 				path,
 				m_aovs[cur].ptr(),

	cur.w = 1;

	if (isInsideX && isInsideY) {
		int px = prevPos.x * (width - 1);
		int py = prevPos.y * (height - 1);

		const auto pidx = getIdx(px, py, width);

		const auto prevAov = prevAOVs[pidx];
		const auto prevDepth = aten::clamp(prevAov.y, CAMERA_NEAR, CAMERA_FAR);

		if (abs(centerDepth - prevDepth) <= 0.5) {
			float4 prev;
			surf2Dread(&prev, outSurface, px * sizeof(float4), py);

			int n = (int)prev.w;

			cur = prev * n + cur;
			cur /= (float)(n + 1);
			cur.w = n + 1;
		}
	}


// TODO
#define CAMERA_NEAR		(0.001f)
#define CAMERA_FAR		(10000.0f)
#define CAMERA_EPSILON	(CAMERA_NEAR / (CAMERA_FAR - CAMERA_NEAR))

__global__ void temporalReprojection(
	const idaten::PathTracing::Path* __restrict__ paths,
	const float4* __restrict__ aovs,
	const float4* __restrict__ prevAOVs,
