MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / Render

Method Render

Source/Engine/Renderer/AtmospherePreCompute.cpp:329–509  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

327}
328
329void 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));

Callers

nothing calls this directly

Calls 15

New2DFunction · 0.85
New3DFunction · 0.85
GetLayerValueFunction · 0.85
ReleaseFunction · 0.85
GetFunction · 0.50
GetShaderMethod · 0.45
SetRenderTargetMethod · 0.45
SetStateMethod · 0.45
ResetRenderTargetMethod · 0.45
BindSRMethod · 0.45
UpdateCBMethod · 0.45

Tested by

no test coverage detected