From 6d4992a22f03c53679b0fbdece17c55fd200f2a2 Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Mon, 27 Jul 2020 20:14:45 +0100 Subject: [PATCH] volumetric cloud updates --- Editor/PostprocessWindow.cpp | 11 ++++++- Editor/PostprocessWindow.h | 1 + Editor/WeatherWindow.cpp | 44 ++++++++++++--------------- Editor/WeatherWindow.h | 3 +- WickedEngine/RenderPath3D.cpp | 1 + WickedEngine/RenderPath3D.h | 2 +- WickedEngine/ShaderInterop_Renderer.h | 9 ++---- WickedEngine/globals.hlsli | 1 - WickedEngine/skyHF.hlsli | 40 ++++++++++++------------ WickedEngine/wiRenderer.cpp | 25 +++++++++------ WickedEngine/wiScene.h | 4 ++- 11 files changed, 74 insertions(+), 67 deletions(-) diff --git a/Editor/PostprocessWindow.cpp b/Editor/PostprocessWindow.cpp index e5a765675..4fca3292b 100644 --- a/Editor/PostprocessWindow.cpp +++ b/Editor/PostprocessWindow.cpp @@ -13,7 +13,7 @@ PostprocessWindow::PostprocessWindow(EditorComponent* editor) : GUI(&editor->Get assert(GUI && "Invalid GUI!"); ppWindow = new wiWindow(GUI, "PostProcess Window"); - ppWindow->SetSize(XMFLOAT2(400, 600)); + ppWindow->SetSize(XMFLOAT2(400, 620)); GUI->AddWidget(ppWindow); float x = 150; @@ -51,6 +51,15 @@ PostprocessWindow::PostprocessWindow(EditorComponent* editor) : GUI(&editor->Get }); ppWindow->AddWidget(lightShaftsCheckBox); + volumetricCloudsCheckBox = new wiCheckBox("Volumetric clouds: "); + volumetricCloudsCheckBox->SetTooltip("Enable volumetric cloud rendering."); + volumetricCloudsCheckBox->SetPos(XMFLOAT2(x, y += step)); + volumetricCloudsCheckBox->SetCheck(editor->renderPath->getVolumetricCloudsEnabled()); + volumetricCloudsCheckBox->OnClick([=](wiEventArgs args) { + editor->renderPath->setVolumetricCloudsEnabled(args.bValue); + }); + ppWindow->AddWidget(volumetricCloudsCheckBox); + aoComboBox = new wiComboBox("AO: "); aoComboBox->SetTooltip("Choose Ambient Occlusion type. RTAO is only available if hardware supports ray tracing"); aoComboBox->SetScriptTip("RenderPath3D::SetAO(int value)"); diff --git a/Editor/PostprocessWindow.h b/Editor/PostprocessWindow.h index a489abf00..6f5683777 100644 --- a/Editor/PostprocessWindow.h +++ b/Editor/PostprocessWindow.h @@ -22,6 +22,7 @@ public: wiSlider* exposureSlider; wiCheckBox* lensFlareCheckBox; wiCheckBox* lightShaftsCheckBox; + wiCheckBox* volumetricCloudsCheckBox; wiComboBox* aoComboBox; wiSlider* aoPowerSlider; wiSlider* aoRangeSlider; diff --git a/Editor/WeatherWindow.cpp b/Editor/WeatherWindow.cpp index 82b866ab5..9956665ec 100644 --- a/Editor/WeatherWindow.cpp +++ b/Editor/WeatherWindow.cpp @@ -22,31 +22,9 @@ WeatherWindow::WeatherWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) float step = 32; - skyTypeCustomButton = new wiButton("Sky Custom"); - skyTypeCustomButton->SetTooltip("Set sky to Custom Atmosphere..."); - skyTypeCustomButton->SetSize(XMFLOAT2(120, 30)); - skyTypeCustomButton->SetPos(XMFLOAT2(x - 100, y += y)); - skyTypeCustomButton->OnClick([=](wiEventArgs args) { - GetWeather().skyType = 0; - - InvalidateProbes(); - }); - weatherWindow->AddWidget(skyTypeCustomButton); - - skyTypeAccurateButton = new wiButton("Sky Accurate"); - skyTypeAccurateButton->SetTooltip("Set sky to PBR Atmosphere..."); - skyTypeAccurateButton->SetSize(XMFLOAT2(120, 30)); - skyTypeAccurateButton->SetPos(XMFLOAT2(x + 30, y)); - skyTypeAccurateButton->OnClick([=](wiEventArgs args) { - GetWeather().skyType = 1; - - InvalidateProbes(); - }); - weatherWindow->AddWidget(skyTypeAccurateButton); - fogStartSlider = new wiSlider(0, 5000, 0, 100000, "Fog Start: "); fogStartSlider->SetSize(XMFLOAT2(100, 30)); - fogStartSlider->SetPos(XMFLOAT2(x, y += step * 2)); + fogStartSlider->SetPos(XMFLOAT2(x, y += step)); fogStartSlider->OnSlide([&](wiEventArgs args) { GetWeather().fogStart = args.fValue; }); @@ -138,9 +116,26 @@ WeatherWindow::WeatherWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) simpleskyCheckBox->OnClick([&](wiEventArgs args) { auto& weather = GetWeather(); weather.SetSimpleSky(args.bValue); - }); + if (args.bValue) + { + weather.SetRealisticSky(false); + } + }); weatherWindow->AddWidget(simpleskyCheckBox); + realisticskyCheckBox = new wiCheckBox("Realistic sky: "); + realisticskyCheckBox->SetTooltip("Physically based sky rendering model."); + realisticskyCheckBox->SetPos(XMFLOAT2(x + 120, y)); + realisticskyCheckBox->OnClick([&](wiEventArgs args) { + auto& weather = GetWeather(); + weather.SetRealisticSky(args.bValue); + if (args.bValue) + { + weather.SetSimpleSky(false); + } + }); + weatherWindow->AddWidget(realisticskyCheckBox); + skyButton = new wiButton("Load Sky"); skyButton->SetTooltip("Load a skybox cubemap texture..."); skyButton->SetSize(XMFLOAT2(240, 30)); @@ -532,6 +527,7 @@ void WeatherWindow::Update() horizonColorPicker->SetPickColor(wiColor::fromFloat3(weather.horizon)); zenithColorPicker->SetPickColor(wiColor::fromFloat3(weather.zenith)); simpleskyCheckBox->SetCheck(weather.IsSimpleSky()); + realisticskyCheckBox->SetCheck(weather.IsRealisticSky()); ocean_enabledCheckBox->SetCheck(weather.IsOceanEnabled()); ocean_patchSizeSlider->SetValue(weather.oceanParameters.patch_length); diff --git a/Editor/WeatherWindow.h b/Editor/WeatherWindow.h index aebca8c19..250f0d116 100644 --- a/Editor/WeatherWindow.h +++ b/Editor/WeatherWindow.h @@ -25,8 +25,6 @@ public: wiGUI* GUI; wiWindow* weatherWindow; - wiButton* skyTypeAccurateButton; - wiButton* skyTypeCustomButton; wiSlider* fogStartSlider; wiSlider* fogEndSlider; wiSlider* fogHeightSlider; @@ -39,6 +37,7 @@ public: wiSlider* windWaveSizeSlider; wiSlider* windRandomnessSlider; wiCheckBox* simpleskyCheckBox; + wiCheckBox* realisticskyCheckBox; wiButton* skyButton; wiColorPicker* ambientColorPicker; wiColorPicker* horizonColorPicker; diff --git a/WickedEngine/RenderPath3D.cpp b/WickedEngine/RenderPath3D.cpp index bdc91f9b6..ab8b339a6 100644 --- a/WickedEngine/RenderPath3D.cpp +++ b/WickedEngine/RenderPath3D.cpp @@ -772,6 +772,7 @@ void RenderPath3D::RenderPostprocessChain(const Texture& srcSceneRT, const Textu std::swap(rt_read, rt_write); device->UnbindResources(TEXSLOT_ONDEMAND0, 1, cmd); } + if (wiRenderer::GetTemporalAAEnabled() && !wiRenderer::GetTemporalAADebugEnabled()) { GraphicsDevice* device = wiRenderer::GetDevice(); diff --git a/WickedEngine/RenderPath3D.h b/WickedEngine/RenderPath3D.h index 09c3850fc..ff16a1728 100644 --- a/WickedEngine/RenderPath3D.h +++ b/WickedEngine/RenderPath3D.h @@ -41,7 +41,7 @@ private: bool reflectionsEnabled = true; bool shadowsEnabled = true; bool bloomEnabled = true; - bool volumetricCloudsEnabled = true; + bool volumetricCloudsEnabled = false; bool colorGradingEnabled = false; bool volumeLightsEnabled = true; bool lightShaftsEnabled = false; diff --git a/WickedEngine/ShaderInterop_Renderer.h b/WickedEngine/ShaderInterop_Renderer.h index d05bc16bc..b29d00739 100644 --- a/WickedEngine/ShaderInterop_Renderer.h +++ b/WickedEngine/ShaderInterop_Renderer.h @@ -160,7 +160,8 @@ static const uint OPTION_BIT_VOXELGI_ENABLED = 1 << 2; static const uint OPTION_BIT_VOXELGI_REFLECTIONS_ENABLED = 1 << 3; static const uint OPTION_BIT_VOXELGI_RETARGETTED = 1 << 4; static const uint OPTION_BIT_SIMPLE_SKY = 1 << 5; -static const uint OPTION_BIT_RAYTRACED_SHADOWS = 1 << 6; +static const uint OPTION_BIT_REALISTIC_SKY = 1 << 6; +static const uint OPTION_BIT_RAYTRACED_SHADOWS = 1 << 7; // ---------- Common Constant buffers: ----------------- @@ -211,7 +212,7 @@ CBUFFER(FrameCB, CBSLOT_RENDERER_FRAME) float g_xFrame_Time; float g_xFrame_TimePrev; - float _padding0_frameCB; + float g_xFrame_SunEnergy; float g_xFrame_WindSpeed; float g_xFrame_DeltaTime; uint g_xFrame_FrameCount; @@ -249,10 +250,6 @@ CBUFFER(FrameCB, CBSLOT_RENDERER_FRAME) float4x4 g_xFrame_MainCamera_PrevVP; // PrevView*PrevProjection float4x4 g_xFrame_MainCamera_PrevInvVP; // Inverse(PrevView*PrevProjection) float4x4 g_xFrame_MainCamera_ReflVP; // ReflectionView*ReflectionProjection - - float2 _padding1_frameCB; - float g_xFrame_SunEnergy; - float g_xFrame_SkyType; }; CBUFFER(CameraCB, CBSLOT_RENDERER_CAMERA) diff --git a/WickedEngine/globals.hlsli b/WickedEngine/globals.hlsli index de750fda2..c3d3c7dfa 100644 --- a/WickedEngine/globals.hlsli +++ b/WickedEngine/globals.hlsli @@ -79,7 +79,6 @@ inline float2 GetInternalResolution() { return g_xFrame_InternalResolution; } inline float GetTime() { return g_xFrame_Time; } inline uint2 GetTemporalAASampleRotation() { return uint2((g_xFrame_TemporalAASampleRotation >> 0) & 0x000000FF, (g_xFrame_TemporalAASampleRotation >> 8) & 0x000000FF); } inline bool IsStaticSky() { return g_xFrame_StaticSkyGamma > 0.0f; } -inline float GetSkyType() { return g_xFrame_SkyType; } inline void ConvertToSpecularGlossiness(inout float4 surface_occlusion_roughness_metallic_reflectance) { surface_occlusion_roughness_metallic_reflectance.r = 1; diff --git a/WickedEngine/skyHF.hlsli b/WickedEngine/skyHF.hlsli index a79c41146..2cd1d74bd 100644 --- a/WickedEngine/skyHF.hlsli +++ b/WickedEngine/skyHF.hlsli @@ -409,11 +409,27 @@ float3 GetDynamicSkyColor(in float3 V, bool sun_enabled = true, bool clouds_enab const float3 sunDirection = GetSunDirection(); const float3 sunColor = GetSunColor(); const float sunEnergy = GetSunEnergy(); - const float atmosphereType = GetSkyType(); float3 sky = float3(0, 0, 0); - - if (atmosphereType == 0) + + if (g_xFrame_Options & OPTION_BIT_REALISTIC_SKY) + { + AtmosphericMedium medium = CreateAtmosphericScattering(); + + sky = AccurateAtmosphericScattering + ( + g_xCamera_CamPos, // Ray origin + V, // Ray direction + sunDirection, // Position of the sun + float3(0.0, -6372e3, 0.0), // Center of the planet + 6371e3, // Radius of the planet in meters + 6471e3, // Radius of the atmosphere in meters + medium, // Atmospheric medium constructor. + sun_enabled, // Use sun and total + dark_enabled // Enable dark mode for light shafts etc. + ); + } + else { sky = CustomAtmosphericScattering ( @@ -424,25 +440,7 @@ float3 GetDynamicSkyColor(in float3 V, bool sun_enabled = true, bool clouds_enab dark_enabled // enable dark mode for light shafts etc. ); } - else - { - AtmosphericMedium medium = CreateAtmosphericScattering(); - - sky = AccurateAtmosphericScattering - ( - g_xCamera_CamPos, // Ray origin - V, // Ray direction - sunDirection, // Position of the sun - float3(0.0, -6372e3, 0.0), // Center of the planet - 6371e3, // Radius of the planet in meters - 6471e3, // Radius of the atmosphere in meters - medium, // Atmospheric medium constructor. - sun_enabled, // Use sun and total - dark_enabled // Enable dark mode for light shafts etc. - ); - } - if (clouds_enabled) { CalculateClouds(sky, V, dark_enabled); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 08348ed08..18f5ed539 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -9182,7 +9182,6 @@ void UpdateFrameCB(CommandList cmd) cb.g_xFrame_Fog = float3(scene.weather.fogStart, scene.weather.fogEnd, scene.weather.fogHeight); cb.g_xFrame_Horizon = scene.weather.horizon; cb.g_xFrame_Zenith = scene.weather.zenith; - cb.g_xFrame_SkyType = scene.weather.skyType; cb.g_xFrame_VoxelRadianceMaxDistance = voxelSceneData.maxDistance; cb.g_xFrame_VoxelRadianceDataSize = voxelSceneData.voxelsize; cb.g_xFrame_VoxelRadianceDataSize_rcp = 1.0f / (float)cb.g_xFrame_VoxelRadianceDataSize; @@ -9297,6 +9296,10 @@ void UpdateFrameCB(CommandList cmd) { cb.g_xFrame_Options |= OPTION_BIT_SIMPLE_SKY; } + if (scene.weather.IsRealisticSky()) + { + cb.g_xFrame_Options |= OPTION_BIT_REALISTIC_SKY; + } if (GetDevice()->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_RAYTRACING) && GetRaytracedShadowsEnabled()) { cb.g_xFrame_Options |= OPTION_BIT_RAYTRACED_SHADOWS; @@ -11577,6 +11580,8 @@ void Postprocess_VolumetricClouds( device->EventBegin("Postprocess_VolumetricClouds", cmd); auto range = wiProfiler::BeginRangeGPU("Volumetric Clouds", cmd); + GPUBarrier memory_barrier = GPUBarrier::Memory(); + const TextureDesc& desc = output.GetDesc(); static TextureDesc initialized_desc; @@ -11678,7 +11683,7 @@ void Postprocess_VolumetricClouds( device->Dispatch(noiseThreadXY, noiseThreadXY, noiseThreadZ, cmd); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } @@ -11698,14 +11703,14 @@ void Postprocess_VolumetricClouds( device->Dispatch(noiseThreadXYZ, noiseThreadXYZ, noiseThreadXYZ, cmd); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } // Generate mip chains for 3D textures: - GenerateMipChain(texture_shapeNoise, MIPGENFILTER_GAUSSIAN, cmd); - GenerateMipChain(texture_detailNoise, MIPGENFILTER_GAUSSIAN, cmd); + GenerateMipChain(texture_shapeNoise, MIPGENFILTER_LINEAR, cmd); + GenerateMipChain(texture_detailNoise, MIPGENFILTER_LINEAR, cmd); // Curl Noise pass: { @@ -11723,7 +11728,7 @@ void Postprocess_VolumetricClouds( device->Dispatch(curlThread, curlThread, 1, cmd); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } @@ -11744,7 +11749,7 @@ void Postprocess_VolumetricClouds( device->Dispatch(weatherThread, weatherThread, 1, cmd); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } @@ -11789,7 +11794,7 @@ void Postprocess_VolumetricClouds( cmd ); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } @@ -11832,7 +11837,7 @@ void Postprocess_VolumetricClouds( cmd ); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } @@ -11860,7 +11865,7 @@ void Postprocess_VolumetricClouds( cmd ); - device->Barrier(&GPUBarrier::Memory(), 1, cmd); + device->Barrier(&memory_barrier, 1, cmd); device->UnbindUAVs(0, arraysize(uavs), cmd); device->EventEnd(cmd); } diff --git a/WickedEngine/wiScene.h b/WickedEngine/wiScene.h index 32b9c0780..c27a5837d 100644 --- a/WickedEngine/wiScene.h +++ b/WickedEngine/wiScene.h @@ -958,14 +958,17 @@ namespace wiScene EMPTY = 0, OCEAN_ENABLED = 1 << 0, SIMPLE_SKY = 1 << 1, + REALISTIC_SKY = 1 << 2, }; uint32_t _flags = EMPTY; inline bool IsOceanEnabled() const { return _flags & OCEAN_ENABLED; } inline bool IsSimpleSky() const { return _flags & SIMPLE_SKY; } + inline bool IsRealisticSky() const { return _flags & REALISTIC_SKY; } inline void SetOceanEnabled(bool value = true) { if (value) { _flags |= OCEAN_ENABLED; } else { _flags &= ~OCEAN_ENABLED; } } inline void SetSimpleSky(bool value = true) { if (value) { _flags |= SIMPLE_SKY; } else { _flags &= ~SIMPLE_SKY; } } + inline void SetRealisticSky(bool value = true) { if (value) { _flags |= REALISTIC_SKY; } else { _flags &= ~REALISTIC_SKY; } } XMFLOAT3 sunColor = XMFLOAT3(0, 0, 0); XMFLOAT3 sunDirection = XMFLOAT3(0, 1, 0); @@ -983,7 +986,6 @@ namespace wiScene float windRandomness = 5; float windWaveSize = 1; float windSpeed = 1; - float skyType = 0; struct OceanParameters {