From 6e6bb36d6d215884b0b3444d43a91d3f2c42b0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Sun, 4 Feb 2024 14:16:41 +0100 Subject: [PATCH] vxgi: always use full resolution resolve --- Editor/GraphicsWindow.cpp | 19 ---- Editor/GraphicsWindow.h | 1 - WickedEngine/shaders/ShaderInterop_VXGI.h | 4 - WickedEngine/wiRenderPath3D.cpp | 7 +- WickedEngine/wiRenderPath3D.h | 3 - WickedEngine/wiRenderer.cpp | 118 ++++------------------ WickedEngine/wiRenderer.h | 10 +- WickedEngine/wiVersion.cpp | 2 +- 8 files changed, 29 insertions(+), 135 deletions(-) diff --git a/Editor/GraphicsWindow.cpp b/Editor/GraphicsWindow.cpp index 2bb595dd5..6eec425f7 100644 --- a/Editor/GraphicsWindow.cpp +++ b/Editor/GraphicsWindow.cpp @@ -305,22 +305,6 @@ void GraphicsWindow::Create(EditorComponent* _editor) vxgiReflectionsCheckBox.SetCheck(wi::renderer::GetVXGIReflectionsEnabled()); AddWidget(&vxgiReflectionsCheckBox); - vxgiFullresCheckBox.Create("VXGI Full Resolution: "); - vxgiFullresCheckBox.SetTooltip("Toggle resolve mode for VXGI opaque. Full resolution will use the full rendering resolution, otherwise it will be upsampled from lower resolution."); - vxgiFullresCheckBox.SetPos(XMFLOAT2(x + wid + 1, y)); - vxgiFullresCheckBox.SetSize(XMFLOAT2(itemheight, itemheight)); - if (editor->main->config.GetSection("graphics").Has("vxgi.fullres")) - { - editor->renderPath->setVXGIResolveFullResolutionEnabled(editor->main->config.GetSection("graphics").GetBool("vxgi.fullres")); - } - vxgiFullresCheckBox.OnClick([=](wi::gui::EventArgs args) { - editor->renderPath->setVXGIResolveFullResolutionEnabled(args.bValue); - editor->main->config.GetSection("graphics").Set("vxgi.fullres", args.bValue); - editor->main->config.Commit(); - }); - vxgiFullresCheckBox.SetCheck(editor->renderPath->getVXGIResolveFullResolutionEnabled()); - AddWidget(&vxgiFullresCheckBox); - vxgiVoxelSizeSlider.Create(0.125f, 0.5f, 1, 7, "VXGI Voxel Size: "); vxgiVoxelSizeSlider.SetTooltip("Adjust the voxel size for VXGI calculations."); vxgiVoxelSizeSlider.SetSize(XMFLOAT2(wid, itemheight)); @@ -1724,7 +1708,6 @@ void GraphicsWindow::ResizeLayout() vxgiDebugCombo.SetVisible(false); vxgiCheckBox.SetVisible(false); vxgiReflectionsCheckBox.SetVisible(false); - vxgiFullresCheckBox.SetVisible(false); vxgiVoxelSizeSlider.SetVisible(false); vxgiRayStepSizeSlider.SetVisible(false); vxgiMaxDistanceSlider.SetVisible(false); @@ -1750,7 +1733,6 @@ void GraphicsWindow::ResizeLayout() vxgiDebugCombo.SetVisible(true); vxgiCheckBox.SetVisible(true); vxgiReflectionsCheckBox.SetVisible(true); - vxgiFullresCheckBox.SetVisible(true); vxgiVoxelSizeSlider.SetVisible(true); vxgiVoxelSizeSlider.SetValue(editor->GetCurrentScene().vxgi.clipmaps[0].voxelsize); vxgiRayStepSizeSlider.SetVisible(true); @@ -1781,7 +1763,6 @@ void GraphicsWindow::ResizeLayout() add_right(vxgiDebugCombo); vxgiCheckBox.SetPos(XMFLOAT2(vxgiDebugCombo.GetPos().x - vxgiCheckBox.GetSize().x - padding, vxgiDebugCombo.GetPos().y)); add_right(vxgiReflectionsCheckBox); - add_right(vxgiFullresCheckBox); add(vxgiVoxelSizeSlider); add(vxgiRayStepSizeSlider); add(vxgiMaxDistanceSlider); diff --git a/Editor/GraphicsWindow.h b/Editor/GraphicsWindow.h index ae3238e7a..2f3dcfe3a 100644 --- a/Editor/GraphicsWindow.h +++ b/Editor/GraphicsWindow.h @@ -30,7 +30,6 @@ public: wi::gui::CheckBox vxgiCheckBox; wi::gui::ComboBox vxgiDebugCombo; wi::gui::CheckBox vxgiReflectionsCheckBox; - wi::gui::CheckBox vxgiFullresCheckBox; wi::gui::Slider vxgiVoxelSizeSlider; wi::gui::Slider vxgiRayStepSizeSlider; wi::gui::Slider vxgiMaxDistanceSlider; diff --git a/WickedEngine/shaders/ShaderInterop_VXGI.h b/WickedEngine/shaders/ShaderInterop_VXGI.h index a5699b613..282f37d1b 100644 --- a/WickedEngine/shaders/ShaderInterop_VXGI.h +++ b/WickedEngine/shaders/ShaderInterop_VXGI.h @@ -13,10 +13,6 @@ // Number of clipmaps, each doubling in size: static const uint VXGI_CLIPMAP_COUNT = 6; -// Upsampling amount for diffuse GI resolve pass: -static const uint VXGI_DIFFUSE_UPSAMPLING = 4; -// Upsampling amount for specular GI resolve pass: -static const uint VXGI_SPECULAR_UPSAMPLING = 2; struct VoxelClipMap { diff --git a/WickedEngine/wiRenderPath3D.cpp b/WickedEngine/wiRenderPath3D.cpp index 4e7e38eae..bd027a71f 100644 --- a/WickedEngine/wiRenderPath3D.cpp +++ b/WickedEngine/wiRenderPath3D.cpp @@ -645,10 +645,10 @@ namespace wi camera->texture_rtshadow_index = device->GetDescriptorIndex(&rtShadow, SubresourceType::SRV); camera->texture_rtdiffuse_index = device->GetDescriptorIndex(&rtRaytracedDiffuse, SubresourceType::SRV); camera->texture_surfelgi_index = device->GetDescriptorIndex(&surfelGIResources.result, SubresourceType::SRV); - camera->texture_vxgi_diffuse_index = device->GetDescriptorIndex(&vxgiResources.diffuse[0], SubresourceType::SRV); + camera->texture_vxgi_diffuse_index = device->GetDescriptorIndex(&vxgiResources.diffuse, SubresourceType::SRV); if (wi::renderer::GetVXGIReflectionsEnabled()) { - camera->texture_vxgi_specular_index = device->GetDescriptorIndex(&vxgiResources.specular[0], SubresourceType::SRV); + camera->texture_vxgi_specular_index = device->GetDescriptorIndex(&vxgiResources.specular, SubresourceType::SRV); } else { @@ -1281,8 +1281,7 @@ namespace wi vxgiResources, *scene, rtLinearDepth, - cmd, - getVXGIResolveFullResolutionEnabled() + cmd ); } if (scene->weather.IsRealisticSky() && scene->weather.IsRealisticSkyAerialPerspective()) diff --git a/WickedEngine/wiRenderPath3D.h b/WickedEngine/wiRenderPath3D.h index b4d846b70..722fbde47 100644 --- a/WickedEngine/wiRenderPath3D.h +++ b/WickedEngine/wiRenderPath3D.h @@ -80,7 +80,6 @@ namespace wi bool sceneUpdateEnabled = true; bool fsrEnabled = false; bool fsr2Enabled = false; - bool vxgiResolveFullResolution = false; uint32_t msaaSampleCount = 1; @@ -256,7 +255,6 @@ namespace wi constexpr bool getSceneUpdateEnabled() const { return sceneUpdateEnabled; } constexpr bool getFSREnabled() const { return fsrEnabled; } constexpr bool getFSR2Enabled() const { return fsr2Enabled; } - constexpr bool getVXGIResolveFullResolutionEnabled() const { return vxgiResolveFullResolution; } constexpr uint32_t getMSAASampleCount() const { return msaaSampleCount; } @@ -311,7 +309,6 @@ namespace wi void setFSREnabled(bool value); void setFSR2Enabled(bool value); void setFSR2Preset(FSR2_Preset preset); // this will modify resolution scaling and sampler lod bias - void setVXGIResolveFullResolutionEnabled(bool value) { vxgiResolveFullResolution = value; } virtual void setMSAASampleCount(uint32_t value) { msaaSampleCount = value; } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 2035b6738..b4494eb13 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -8427,24 +8427,14 @@ void CreateVXGIResources(VXGIResources& res, XMUINT2 resolution) desc.width = resolution.x; desc.height = resolution.y; desc.format = Format::R11G11B10_FLOAT; - device->CreateTexture(&desc, nullptr, &res.diffuse[0]); - device->SetName(&res.diffuse[0], "vxgi.diffuse[0]"); - - desc.width = resolution.x / VXGI_DIFFUSE_UPSAMPLING; - desc.height = resolution.y / VXGI_DIFFUSE_UPSAMPLING; - device->CreateTexture(&desc, nullptr, &res.diffuse[1]); - device->SetName(&res.diffuse[1], "vxgi.diffuse[1]"); + device->CreateTexture(&desc, nullptr, &res.diffuse); + device->SetName(&res.diffuse, "vxgi.diffuse"); desc.width = resolution.x; desc.height = resolution.y; desc.format = Format::R16G16B16A16_FLOAT; - device->CreateTexture(&desc, nullptr, &res.specular[0]); - device->SetName(&res.specular[0], "vxgi.specular[0]"); - - desc.width = resolution.x / VXGI_SPECULAR_UPSAMPLING; - desc.height = resolution.y / VXGI_SPECULAR_UPSAMPLING; - device->CreateTexture(&desc, nullptr, &res.specular[1]); - device->SetName(&res.specular[1], "vxgi.specular[1]"); + device->CreateTexture(&desc, nullptr, &res.specular); + device->SetName(&res.specular, "vxgi.specular"); res.pre_clear = true; } @@ -8652,8 +8642,7 @@ void VXGI_Resolve( const VXGIResources& res, const Scene& scene, Texture texture_lineardepth, - CommandList cmd, - bool fullres + CommandList cmd ) { if (!GetVXGIEnabled() || !scene.vxgi.radiance.IsValid()) @@ -8671,41 +8660,26 @@ void VXGI_Resolve( res.pre_clear = false; { GPUBarrier barriers[] = { - GPUBarrier::Image(&res.diffuse[0], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), - GPUBarrier::Image(&res.diffuse[1], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), - GPUBarrier::Image(&res.specular[0], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), - GPUBarrier::Image(&res.specular[1], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), + GPUBarrier::Image(&res.diffuse, ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), + GPUBarrier::Image(&res.specular, ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), }; device->Barrier(barriers, arraysize(barriers), cmd); } - device->ClearUAV(&res.diffuse[0], 0, cmd); - device->ClearUAV(&res.diffuse[1], 0, cmd); - device->ClearUAV(&res.specular[0], 0, cmd); - device->ClearUAV(&res.specular[1], 0, cmd); + device->ClearUAV(&res.diffuse, 0, cmd); + device->ClearUAV(&res.specular, 0, cmd); { GPUBarrier barriers[] = { - GPUBarrier::Image(&res.diffuse[0], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), - GPUBarrier::Image(&res.diffuse[1], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), - GPUBarrier::Image(&res.specular[0], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), - GPUBarrier::Image(&res.specular[1], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), + GPUBarrier::Image(&res.diffuse, ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), + GPUBarrier::Image(&res.specular, ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), }; device->Barrier(barriers, arraysize(barriers), cmd); } } - if(fullres) { GPUBarrier barriers[] = { - GPUBarrier::Image(&res.diffuse[0], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), - GPUBarrier::Image(&res.specular[0], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), - }; - device->Barrier(barriers, arraysize(barriers), cmd); - } - else - { - GPUBarrier barriers[] = { - GPUBarrier::Image(&res.diffuse[1], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), - GPUBarrier::Image(&res.specular[1], ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), + GPUBarrier::Image(&res.diffuse, ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), + GPUBarrier::Image(&res.specular, ResourceState::SHADER_RESOURCE, ResourceState::UNORDERED_ACCESS), }; device->Barrier(barriers, arraysize(barriers), cmd); } @@ -8715,18 +8689,9 @@ void VXGI_Resolve( device->BindComputeShader(&shaders[CSTYPE_VXGI_RESOLVE_DIFFUSE], cmd); PostProcess postprocess; - if (fullres) - { - device->BindUAV(&res.diffuse[0], 0, cmd); - postprocess.resolution.x = res.diffuse[0].desc.width; - postprocess.resolution.y = res.diffuse[0].desc.height; - } - else - { - device->BindUAV(&res.diffuse[1], 0, cmd); - postprocess.resolution.x = res.diffuse[1].desc.width; - postprocess.resolution.y = res.diffuse[1].desc.height; - } + device->BindUAV(&res.diffuse, 0, cmd); + postprocess.resolution.x = res.diffuse.desc.width; + postprocess.resolution.y = res.diffuse.desc.height; postprocess.resolution_rcp.x = 1.0f / postprocess.resolution.x; postprocess.resolution_rcp.y = 1.0f / postprocess.resolution.y; device->PushConstants(&postprocess, sizeof(postprocess), cmd); @@ -8746,18 +8711,9 @@ void VXGI_Resolve( device->BindComputeShader(&shaders[CSTYPE_VXGI_RESOLVE_SPECULAR], cmd); PostProcess postprocess; - if (fullres) - { - device->BindUAV(&res.specular[0], 0, cmd); - postprocess.resolution.x = res.specular[0].desc.width; - postprocess.resolution.y = res.specular[0].desc.height; - } - else - { - device->BindUAV(&res.specular[1], 0, cmd); - postprocess.resolution.x = res.specular[1].desc.width; - postprocess.resolution.y = res.specular[1].desc.height; - } + device->BindUAV(&res.specular, 0, cmd); + postprocess.resolution.x = res.specular.desc.width; + postprocess.resolution.y = res.specular.desc.height; postprocess.resolution_rcp.x = 1.0f / postprocess.resolution.x; postprocess.resolution_rcp.y = 1.0f / postprocess.resolution.y; device->PushConstants(&postprocess, sizeof(postprocess), cmd); @@ -8771,45 +8727,13 @@ void VXGI_Resolve( device->EventEnd(cmd); } - if(fullres) { GPUBarrier barriers[] = { - GPUBarrier::Image(&res.diffuse[0], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), - GPUBarrier::Image(&res.specular[0], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), + GPUBarrier::Image(&res.diffuse, ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), + GPUBarrier::Image(&res.specular, ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), }; device->Barrier(barriers, arraysize(barriers), cmd); } - else - { - GPUBarrier barriers[] = { - GPUBarrier::Image(&res.diffuse[1], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), - GPUBarrier::Image(&res.specular[1], ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE), - }; - device->Barrier(barriers, arraysize(barriers), cmd); - } - - if (!fullres) - { - const float depth_threshold = 0.5f; - - Postprocess_Upsample_Bilateral( - res.diffuse[1], - texture_lineardepth, - res.diffuse[0], - cmd, - false, - depth_threshold - ); - - Postprocess_Upsample_Bilateral( - res.specular[1], - texture_lineardepth, - res.specular[0], - cmd, - false, - depth_threshold - ); - } wi::profiler::EndRange(range); device->EventEnd(cmd); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index edc3da9a7..730086d74 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -411,11 +411,11 @@ namespace wi::renderer // VXGI: Voxel-based Global Illumination (voxel cone tracing-based) struct VXGIResources { - wi::graphics::Texture diffuse[2]; - wi::graphics::Texture specular[2]; + wi::graphics::Texture diffuse; + wi::graphics::Texture specular; mutable bool pre_clear = true; - bool IsValid() const { return diffuse[0].IsValid(); } + bool IsValid() const { return diffuse.IsValid(); } }; void CreateVXGIResources(VXGIResources& res, XMUINT2 resolution); void VXGI_Voxelize( @@ -423,13 +423,11 @@ namespace wi::renderer wi::graphics::CommandList cmd ); // Resolve VXGI to screen - // fullres : if true it will be in native resolution, otherwise it will use some upsampling from low res void VXGI_Resolve( const VXGIResources& res, const wi::scene::Scene& scene, wi::graphics::Texture texture_lineardepth, - wi::graphics::CommandList cmd, - bool fullres = false + wi::graphics::CommandList cmd ); void Postprocess_Blur_Gaussian( diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index a3fec8636..3bac00c89 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 366; + const int revision = 367; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);