 				(height + block.y - 1) / block.y);
 
 			float sintime = aten::abs(aten::sin((m_frame & 0xf) * AT_MATH_PI));
+
+			// http://en.wikipedia.org/wiki/Halton_sequence
+			const static float2 offset[8][2] = {
+				make_float2( 1.0f / 2.0f, 1.0f / 3.0f ),
+				make_float2( 1.0f / 4.0f, 2.0f / 3.0f ),
+				make_float2( 3.0f / 4.0f, 1.0f / 9.0f ),
+				make_float2( 1.0f / 8.0f, 4.0f / 9.0f ),
+				make_float2( 5.0f / 8.0f, 7.0f / 9.0f ),
+				make_float2( 3.0f / 8.0f, 2.0f / 9.0f ),
+				make_float2( 7.0f / 8.0f, 5.0f / 9.0f ),
+				make_float2( 1.0f / 16.0f, 8.0f / 9.0f ),
+			};
+
+			auto frame = (m_frame + 1) & 0x7;
 
 			if (canShowTAADiff()) {
 				temporalAA<true> << <grid, block >> > (

		float unbiased_diff = abs(lum0 - lum1) / max(lum0, max(lum1, 0.2f));
		float unbiased_weight = 1.0 - unbiased_diff;
		float unbiased_weight_sqr = unbiased_weight * unbiased_weight;
		float k_feedback = lerp(0.8, 0.2, unbiased_weight_sqr);

		auto c = lerp(clr0, clr1, k_feedback);

#ifdef ENABLE_YCOCG
		c = YCoCg2RGB(ycocg);
#endif

		auto noise4 = PDsrand4(make_float2(ix, iy) + sinTime + 0.6959174f) / 510.0f;
		noise4.w = 0;

		auto f = make_float4(c.x, c.y, c.z, 1) + noise4;

	auto p = make_int2(ix, iy);

	auto* sampler = &paths[idx].sampler;

	auto tmp = sampleColorRGB(curAovs, width, height, p);

