| 327 | } |
| 328 | |
| 329 | void AtmospherePreComputeImpl::Render(RenderTask* task, GPUContext* context) |
| 330 | { |
| 331 | // If job has been cancelled (eg. on window close) |
| 332 | if (_wasCancelled) |
| 333 | { |
| 334 | LOG(Warning, "AtmospherePreCompute job cancelled"); |
| 335 | return; |
| 336 | } |
| 337 | ASSERT(_isUpdatePending && _updateFrameNumber == 0); |
| 338 | PROFILE_GPU_CPU("AtmospherePreCompute"); |
| 339 | |
| 340 | // Allocate temporary render targets |
| 341 | auto desc = GPUTextureDescription::New2D(IrradianceTexWidth, IrradianceTexHeight, PixelFormat::R16G16B16A16_Float, GPUTextureFlags::ShaderResource | GPUTextureFlags::RenderTarget); |
| 342 | auto AtmosphereDeltaE = RenderTargetPool::Get(desc); |
| 343 | desc = GPUTextureDescription::New3D(InscatterWidth, InscatterHeight, InscatterDepth, PixelFormat::R16G16B16A16_Float, GPUTextureFlags::ShaderResource | GPUTextureFlags::RenderTarget | GPUTextureFlags::PerSliceViews); |
| 344 | auto AtmosphereDeltaSR = RenderTargetPool::Get(desc); |
| 345 | desc = GPUTextureDescription::New3D(InscatterWidth, InscatterHeight, InscatterDepth, PixelFormat::R16G16B16A16_Float, GPUTextureFlags::ShaderResource | GPUTextureFlags::RenderTarget | GPUTextureFlags::PerSliceViews); |
| 346 | auto AtmosphereDeltaSM = RenderTargetPool::Get(desc); |
| 347 | desc = GPUTextureDescription::New3D(InscatterWidth, InscatterHeight, InscatterDepth, PixelFormat::R16G16B16A16_Float, GPUTextureFlags::ShaderResource | GPUTextureFlags::RenderTarget | GPUTextureFlags::PerSliceViews); |
| 348 | auto AtmosphereDeltaJ = RenderTargetPool::Get(desc); |
| 349 | if (!AtmosphereDeltaE || !AtmosphereDeltaSR || !AtmosphereDeltaSM || !AtmosphereDeltaJ) |
| 350 | return; |
| 351 | RENDER_TARGET_POOL_SET_NAME(AtmosphereDeltaE, "AtmospherePreCompute.DeltaE"); |
| 352 | RENDER_TARGET_POOL_SET_NAME(AtmosphereDeltaSR, "AtmospherePreCompute.DeltaSR"); |
| 353 | RENDER_TARGET_POOL_SET_NAME(AtmosphereDeltaSM, "AtmospherePreCompute.DeltaSM"); |
| 354 | RENDER_TARGET_POOL_SET_NAME(AtmosphereDeltaJ, "AtmospherePreCompute.DeltaJ"); |
| 355 | |
| 356 | const auto shader = _shader->GetShader(); |
| 357 | const auto cb = shader->GetCB(0); |
| 358 | Data data; |
| 359 | |
| 360 | // Compute transmittance texture T (line 1 in algorithm 4.1) |
| 361 | context->SetRenderTarget(*AtmosphereTransmittance); |
| 362 | context->SetViewportAndScissors((float)TransmittanceTexWidth, (float)TransmittanceTexHeight); |
| 363 | context->SetState(_psTransmittance); |
| 364 | context->DrawFullscreenTriangle(); |
| 365 | context->ResetRenderTarget(); |
| 366 | |
| 367 | // Compute irradiance texture deltaE (line 2 in algorithm 4.1) |
| 368 | context->SetRenderTarget(*AtmosphereDeltaE); |
| 369 | context->SetViewportAndScissors((float)IrradianceTexWidth, (float)IrradianceTexHeight); |
| 370 | context->BindSR(0, AtmosphereTransmittance); |
| 371 | context->SetState(_psIrradiance1); |
| 372 | context->DrawFullscreenTriangle(); |
| 373 | context->ResetRenderTarget(); |
| 374 | |
| 375 | // Compute single scattering texture deltaS (line 3 in algorithm 4.1) |
| 376 | // Rayleigh and Mie separated in deltaSR + deltaSM |
| 377 | context->SetViewportAndScissors((float)InscatterWidth, (float)InscatterHeight); |
| 378 | context->SetState(_psInscatter1_A); |
| 379 | for (int32 layer = 0; layer < InscatterAltitudeSampleNum; layer++) |
| 380 | { |
| 381 | GetLayerValue(layer, data.AtmosphereR, data.dhdh); |
| 382 | data.AtmosphereLayer = layer; |
| 383 | context->UpdateCB(cb, &data); |
| 384 | context->BindCB(0, cb); |
| 385 | |
| 386 | context->SetRenderTarget(AtmosphereDeltaSR->View(layer)); |
nothing calls this directly
no test coverage detected