int RenderCore::step(Rand& rand, int groupIdx) { const Camera* active_camera = &camera; float4x4 inv_view = glm::inverse(active_camera->view()); float4x4 inv_proj = glm::inverse(active_camera->projection()); float3 o = active_camera->eye; int samples_n = 0; bool clear = clearSignal_[groupIdx]; for(int i = 0; i < size_.y; i++) { if((i % cachedWorkThreadN_) != groupIdx) continue; for(int j = 0; j < size_.x; j++) { int fb_i = i * size_.x + j; Sample sample; sample.reset(); if(clear) { linear_fb[fb_i] = float4(0); } float2 pixel_pos(j, i); float2 sample_pos = pixel_pos + float2(rand.next01(), rand.next01()); float4 ndc((sample_pos.x/size_.x-0.5)*2, (sample_pos.y/size_.y-0.5)*2, 1, 1); float4 d_comp = inv_proj * ndc; d_comp = d_comp/d_comp.w; d_comp = inv_view * d_comp; float3 d = normalize(float3(d_comp)); Ray ray(o, d); sample.ray = ray; sample.xy = int2(j, i); sampleDebugger_.shr.newSample(sample.xy); int bounces = 8 ; if(1) { ptMISRun(*scene, bounces, rand, &sample, false); } else if(0) { ptRun(*scene, bounces, rand, &sample, false); } else if(0) { bdptRun(*scene, bounces, rand, &sample); } else { bdptMisRun(*scene, bounces, active_camera->forward, rand, &sample); } samples_n += 1; float3 color = sample.radiance; sampleDebugger_.shr.record(sample.xy, 7, "Radiance", color); float3 existing_color = float3(linear_fb[fb_i]); sampleDebugger_.shr.record(sample.xy, 7, "Existing Mix", existing_color); float samples_count = linear_fb[fb_i].w + 1; float3 mixed_color = float3((samples_count - 1) / samples_count) * existing_color + float3(1/samples_count) * color; sampleDebugger_.shr.record(sample.xy, 7, "New Mix", mixed_color); linear_fb[fb_i] = float4(mixed_color, samples_count); } } //we don't clear unconditionally b/c clear may have been enabled since we last checked if(clear) clearSignal_[groupIdx] = false; return samples_n; }
void Handler::dispatch(Msg& msg) { ptRun(msg); }