| 565 | } |
| 566 | |
| 567 | void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx, |
| 568 | ITextureView* pEnvironmentMap, |
| 569 | Uint32 NumDiffuseSamples, |
| 570 | Uint32 NumSpecularSamples, |
| 571 | bool OptimizeSamples) |
| 572 | { |
| 573 | if (!m_Settings.EnableIBL) |
| 574 | { |
| 575 | LOG_WARNING_MESSAGE("IBL is disabled, so precomputing cube maps will have no effect"); |
| 576 | return; |
| 577 | } |
| 578 | |
| 579 | if (NumSpecularSamples == 0) |
| 580 | { |
| 581 | NumSpecularSamples = 256; |
| 582 | } |
| 583 | if (NumDiffuseSamples == 0) |
| 584 | { |
| 585 | NumDiffuseSamples = GetDefaultDiffuseSamplesCount(m_Device.GetAdapterInfo()); |
| 586 | } |
| 587 | |
| 588 | struct PrecomputeEnvMapAttribs |
| 589 | { |
| 590 | float4x4 Rotation; |
| 591 | |
| 592 | float Roughness; |
| 593 | float EnvMapWidth; |
| 594 | float EnvMapHeight; |
| 595 | float EnvMapMipCount; |
| 596 | |
| 597 | uint NumSamples; |
| 598 | uint Padding0; |
| 599 | uint Padding1; |
| 600 | uint Padding2; |
| 601 | }; |
| 602 | |
| 603 | if (!m_PrecomputeEnvMapAttribsCB) |
| 604 | { |
| 605 | CreateUniformBuffer(m_Device, sizeof(PrecomputeEnvMapAttribs), "Precompute env map attribs CB", &m_PrecomputeEnvMapAttribsCB); |
| 606 | } |
| 607 | |
| 608 | IBL_FEATURE_FLAGS FeatureFlags = IBL_FEATURE_FLAG_NONE; |
| 609 | |
| 610 | if (OptimizeSamples) |
| 611 | FeatureFlags |= IBL_FEATURE_FLAG_OPTIMIZE_SAMPLES; |
| 612 | |
| 613 | const IBL_PSOKey::ENV_MAP_TYPE EnvMapType = pEnvironmentMap->GetTexture()->GetDesc().IsCube() ? |
| 614 | IBL_PSOKey::ENV_MAP_TYPE_CUBE : |
| 615 | IBL_PSOKey::ENV_MAP_TYPE_SPHERE; |
| 616 | |
| 617 | ShaderMacroHelper Macros; |
| 618 | Macros |
| 619 | .Add("OPTIMIZE_SAMPLES", (FeatureFlags & IBL_FEATURE_FLAG_OPTIMIZE_SAMPLES) != 0) |
| 620 | .Add("ENV_MAP_TYPE_CUBE", static_cast<int>(IBL_PSOKey::ENV_MAP_TYPE_CUBE)) |
| 621 | .Add("ENV_MAP_TYPE_SPHERE", static_cast<int>(IBL_PSOKey::ENV_MAP_TYPE_SPHERE)) |
| 622 | .Add("ENV_MAP_TYPE", static_cast<int>(EnvMapType)); |
| 623 | |
| 624 | auto& PrecomputeIrradianceCubeTech = m_IBL_PSOCache[IBL_PSOKey{IBL_PSOKey::PSO_TYPE_IRRADIANCE_CUBE, EnvMapType, FeatureFlags, m_pIrradianceCubeSRV->GetDesc().Format}]; |
no test coverage detected