From 3a766f7606e6200d2616fa036b122b2ff394d248 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 31 Dec 2025 12:44:11 -0500 Subject: [PATCH] maint: added htrace ssgi --- Assets/Plugins/HTraceSSGI.meta | 8 + .../HTraceSSGI Quick-Start Manual.pdf | Bin 0 -> 168657 bytes .../HTraceSSGI Quick-Start Manual.pdf.meta | 14 + Assets/Plugins/HTraceSSGI/HTraceSSGI.asmdef | 24 + .../Plugins/HTraceSSGI/HTraceSSGI.asmdef.meta | 10 + Assets/Plugins/HTraceSSGI/Icons.meta | 8 + .../HTraceSSGI/Icons/HTrace SSGI Icon.png | Bin 0 -> 4428 bytes .../Icons/HTrace SSGI Icon.png.meta | 124 ++ .../Plugins/HTraceSSGI/Icons/Resources.meta | 8 + .../Icons/Resources/SSGI UI Card.png | Bin 0 -> 75738 bytes .../Icons/Resources/SSGI UI Card.png.meta | 124 ++ Assets/Plugins/HTraceSSGI/Resources.meta | 8 + .../HTraceSSGI/Resources/HTraceSSGI.meta | 8 + .../Resources/HTraceSSGI/BlueNoise.meta | 8 + .../BlueNoise/OwenScrambledNoise256.png | Bin 0 -> 65960 bytes .../BlueNoise/OwenScrambledNoise256.png.meta | 137 ++ .../BlueNoise/OwenScrambledNoise4.png | Bin 0 -> 1117 bytes .../BlueNoise/OwenScrambledNoise4.png.meta | 137 ++ .../HTraceSSGI/BlueNoise/RankingTile1SPP.png | Bin 0 -> 96 bytes .../BlueNoise/RankingTile1SPP.png.meta | 137 ++ .../BlueNoise/RankingTile256SPP.png | Bin 0 -> 85522 bytes .../BlueNoise/RankingTile256SPP.png.meta | 137 ++ .../HTraceSSGI/BlueNoise/RankingTile8SPP.png | Bin 0 -> 29706 bytes .../BlueNoise/RankingTile8SPP.png.meta | 137 ++ .../HTraceSSGI/BlueNoise/ScrambleNoise.png | Bin 0 -> 154779 bytes .../BlueNoise/ScrambleNoise.png.meta | 137 ++ .../BlueNoise/ScramblingTile1SPP.png | Bin 0 -> 132316 bytes .../BlueNoise/ScramblingTile1SPP.png.meta | 137 ++ .../BlueNoise/ScramblingTile256SPP.png | Bin 0 -> 132320 bytes .../BlueNoise/ScramblingTile256SPP.png.meta | 137 ++ .../BlueNoise/ScramblingTile8SPP.png | Bin 0 -> 132319 bytes .../BlueNoise/ScramblingTile8SPP.png.meta | 137 ++ .../Resources/HTraceSSGI/Computes.meta | 3 + .../Computes/HCheckerboardingSSGI.compute | 85 ++ .../HCheckerboardingSSGI.compute.meta | 14 + .../HTraceSSGI/Computes/HDebugSSGI.compute | 116 ++ .../Computes/HDebugSSGI.compute.meta | 14 + .../HTraceSSGI/Computes/HDenoiserSSGI.compute | 343 +++++ .../Computes/HDenoiserSSGI.compute.meta | 14 + .../HTraceSSGI/Computes/HDepthPyramid.compute | 115 ++ .../Computes/HDepthPyramid.compute.meta | 14 + .../Computes/HInterpolationSSGI.compute | 215 +++ .../Computes/HInterpolationSSGI.compute.meta | 14 + .../HTraceSSGI/Computes/HRenderSSGI.compute | 231 +++ .../Computes/HRenderSSGI.compute.meta | 14 + .../HTraceSSGI/Computes/HRestirSSGI.compute | 498 ++++++ .../Computes/HRestirSSGI.compute.meta | 14 + .../HTemporalReprojectionSSGI.compute | 438 ++++++ .../HTemporalReprojectionSSGI.compute.meta | 14 + .../HTraceSSGI Volume Profile URP.asset | 62 + .../HTraceSSGI Volume Profile URP.asset.meta | 15 + .../Resources/HTraceSSGI/Headers.meta | 3 + .../HTraceSSGI/Headers/HDRP files.meta | 8 + .../HTraceSSGI/Headers/HDRP files/Color.hlsl | 21 + .../Headers/HDRP files/Color.hlsl.meta | 10 + .../HDRP files/RaytracingSampling.hlsl | 77 + .../HDRP files/RaytracingSampling.hlsl.meta | 14 + .../Resources/HTraceSSGI/Headers/HMain.hlsl | 219 +++ .../HTraceSSGI/Headers/HMain.hlsl.meta | 14 + .../Resources/HTraceSSGI/Headers/HMath.hlsl | 154 ++ .../HTraceSSGI/Headers/HMath.hlsl.meta | 14 + .../HTraceSSGI/Headers/HSpaceTransforms.hlsl | 144 ++ .../Headers/HSpaceTransforms.hlsl.meta | 10 + .../Resources/HTraceSSGI/Includes.meta | 8 + .../HTraceSSGI/Includes/HCommonSSGI.hlsl | 237 +++ .../HTraceSSGI/Includes/HCommonSSGI.hlsl.meta | 14 + .../HTraceSSGI/Includes/HFallbackSSGI.hlsl | 66 + .../Includes/HFallbackSSGI.hlsl.meta | 14 + .../HTraceSSGI/Includes/HRayMarchingSSGI.hlsl | 195 +++ .../Includes/HRayMarchingSSGI.hlsl.meta | 14 + .../HTraceSSGI/Includes/HReservoirSSGI.hlsl | 242 +++ .../Includes/HReservoirSSGI.hlsl.meta | 14 + .../Resources/HTraceSSGI/Shaders.meta | 8 + .../Resources/HTraceSSGI/Shaders/URP.meta | 3 + .../Shaders/URP/ColorComposeURP.shader | 210 +++ .../Shaders/URP/ColorComposeURP.shader.meta | 16 + .../Shaders/URP/MotionVectorsURP.shader | 231 +++ .../Shaders/URP/MotionVectorsURP.shader.meta | 10 + Assets/Plugins/HTraceSSGI/Sample Scene.meta | 8 + .../Default HTrace SSGI Profile.asset | 65 + .../Default HTrace SSGI Profile.asset.meta | 15 + .../Sample Scene/Sample Scene SSGI URP.meta | 8 + ...SSGI Sample Scene URP Volume Profile.asset | 1024 +++++++++++++ ...Sample Scene URP Volume Profile.asset.meta | 16 + .../HTrace SSGI Sample Scene URP.unity | 1359 +++++++++++++++++ .../HTrace SSGI Sample Scene URP.unity.meta | 15 + .../Sample Scene SSGI URP/Material Green.mat | 356 +++++ .../Material Green.mat.meta | 15 + .../Sample Scene SSGI URP/Material Red.mat | 356 +++++ .../Material Red.mat.meta | 15 + .../Sample Scene SSGI URP/Material White.mat | 358 +++++ .../Material White.mat.meta | 15 + Assets/Plugins/HTraceSSGI/Scripts.meta | 8 + Assets/Plugins/HTraceSSGI/Scripts/Data.meta | 3 + .../HTraceSSGI/Scripts/Data/Public.meta | 3 + .../Scripts/Data/Public/DebugSettings.cs | 21 + .../Scripts/Data/Public/DebugSettings.cs.meta | 10 + .../Scripts/Data/Public/DenoisingSettings.cs | 122 ++ .../Data/Public/DenoisingSettings.cs.meta | 10 + .../Scripts/Data/Public/GeneralSettings.cs | 129 ++ .../Data/Public/GeneralSettings.cs.meta | 10 + .../Data/Public/HTraceSSGIPresetData.cs | 246 +++ .../Data/Public/HTraceSSGIPresetData.cs.meta | 18 + .../Scripts/Data/Public/HTraceSSGIProfile.cs | 91 ++ .../Data/Public/HTraceSSGIProfile.cs.meta | 10 + .../Scripts/Data/Public/HTraceSSGISettings.cs | 29 + .../Data/Public/HTraceSSGISettings.cs.meta | 10 + .../Scripts/Data/Public/SSGISettings.cs | 187 +++ .../Scripts/Data/Public/SSGISettings.cs.meta | 10 + .../Plugins/HTraceSSGI/Scripts/Default.asset | 122 ++ .../HTraceSSGI/Scripts/Default.asset.meta | 15 + Assets/Plugins/HTraceSSGI/Scripts/Editor.meta | 3 + .../Scripts/Editor/HDEditorUtilsWrapper.cs | 305 ++++ .../Editor/HDEditorUtilsWrapper.cs.meta | 10 + .../Scripts/Editor/HEditorStyles.cs | 133 ++ .../Scripts/Editor/HEditorStyles.cs.meta | 10 + .../HTraceSSGI/Scripts/Editor/HEditorUtils.cs | 243 +++ .../Scripts/Editor/HEditorUtils.cs.meta | 10 + .../Scripts/Editor/HTraceSSGIEditor.cs | 140 ++ .../Scripts/Editor/HTraceSSGIEditor.cs.meta | 10 + .../Scripts/Editor/HTraceSSGIProfileEditor.cs | 456 ++++++ .../Editor/HTraceSSGIProfileEditor.cs.meta | 10 + .../Editor/HTraceSSGIRendererFeatureEditor.cs | 31 + .../HTraceSSGIRendererFeatureEditor.cs.meta | 10 + .../Editor/HTraceSSGIVolumeEditorURP.cs | 468 ++++++ .../Editor/HTraceSSGIVolumeEditorURP.cs.meta | 10 + .../Scripts/Editor/WindowsAndMenu.meta | 3 + .../WindowsAndMenu/AssetWelcomeLoader.cs | 41 + .../WindowsAndMenu/AssetWelcomeLoader.cs.meta | 10 + .../WindowsAndMenu/AssetWelcomeWindow.cs | 139 ++ .../WindowsAndMenu/AssetWelcomeWindow.cs.meta | 10 + .../WindowsAndMenu/HBugReporterWindow.cs | 98 ++ .../WindowsAndMenu/HBugReporterWindow.cs.meta | 10 + .../WindowsAndMenu/HMenuAndFilesManager.cs | 52 + .../HMenuAndFilesManager.cs.meta | 18 + .../HTraceSSGI/Scripts/Extensions.meta | 3 + .../Extensions/CameraHistorySystem.meta | 3 + .../CameraHistorySystem.cs | 71 + .../CameraHistorySystem.cs.meta | 10 + .../CameraHistorySystem/ICameraHistoryData.cs | 8 + .../ICameraHistoryData.cs.meta | 10 + .../Scripts/Extensions/ExtensionsURP.cs | 32 + .../Scripts/Extensions/ExtensionsURP.cs.meta | 10 + .../Scripts/Extensions/HExtensions.cs | 261 ++++ .../Scripts/Extensions/HExtensions.cs.meta | 10 + .../Scripts/Extensions/IHistoryData.cs | 7 + .../Scripts/Extensions/IHistoryData.cs.meta | 10 + .../Plugins/HTraceSSGI/Scripts/Globals.meta | 3 + .../HTraceSSGI/Scripts/Globals/HEnums.cs | 71 + .../HTraceSSGI/Scripts/Globals/HEnums.cs.meta | 10 + .../HTraceSSGI/Scripts/Globals/HMath.cs | 183 +++ .../HTraceSSGI/Scripts/Globals/HMath.cs.meta | 10 + .../HTraceSSGI/Scripts/Globals/HNames.cs | 32 + .../HTraceSSGI/Scripts/Globals/HNames.cs.meta | 10 + .../HTraceSSGI/Scripts/Globals/HRenderer.cs | 135 ++ .../Scripts/Globals/HRenderer.cs.meta | 10 + .../Scripts/Globals/HRendererURP.cs | 264 ++++ .../Scripts/Globals/HRendererURP.cs.meta | 10 + .../Scripts/Globals/HShaderParams.cs | 75 + .../Scripts/Globals/HShaderParams.cs.meta | 9 + .../Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs | 51 + .../HTraceSSGI/Scripts/HTraceSSGI.cs.meta | 18 + .../HTraceSSGI/Scripts/Infrastructure.meta | 3 + .../Scripts/Infrastructure/URP.meta | 3 + .../URP/HAmbientOverrideVolume.cs | 180 +++ .../URP/HAmbientOverrideVolume.cs.meta | 10 + .../URP/HTraceSSGIRendererFeature.cs | 229 +++ .../URP/HTraceSSGIRendererFeature.cs.meta | 10 + .../Infrastructure/URP/HTraceSSGIVolume.cs | 231 +++ .../URP/HTraceSSGIVolume.cs.meta | 10 + Assets/Plugins/HTraceSSGI/Scripts/Passes.meta | 3 + .../HTraceSSGI/Scripts/Passes/Shared.meta | 3 + .../Scripts/Passes/Shared/HBlueNoise.cs | 63 + .../Scripts/Passes/Shared/HBlueNoise.cs.meta | 10 + .../HTraceSSGI/Scripts/Passes/Shared/SSGI.cs | 667 ++++++++ .../Scripts/Passes/Shared/SSGI.cs.meta | 10 + .../HTraceSSGI/Scripts/Passes/URP.meta | 3 + .../Scripts/Passes/URP/FinalPassURP.cs | 110 ++ .../Scripts/Passes/URP/FinalPassURP.cs.meta | 10 + .../Scripts/Passes/URP/GBufferPassURP.cs | 498 ++++++ .../Scripts/Passes/URP/GBufferPassURP.cs.meta | 10 + .../Scripts/Passes/URP/MotionVectorsURP.cs | 345 +++++ .../Passes/URP/MotionVectorsURP.cs.meta | 10 + .../Scripts/Passes/URP/PrePassURP.cs | 225 +++ .../Scripts/Passes/URP/PrePassURP.cs.meta | 10 + .../Scripts/Passes/URP/SSGIPassURP.cs | 446 ++++++ .../Scripts/Passes/URP/SSGIPassURP.cs.meta | 10 + .../Plugins/HTraceSSGI/Scripts/Patcher.meta | 3 + .../Scripts/Patcher/InstalledPackage.cs | 48 + .../Scripts/Patcher/InstalledPackage.cs.meta | 10 + .../Scripts/PipelelinesConfigurator.meta | 3 + .../ConfiguratorUtiles.cs | 84 + .../ConfiguratorUtiles.cs.meta | 10 + .../HPipelinesConfigurator.cs | 101 ++ .../HPipelinesConfigurator.cs.meta | 10 + .../Plugins/HTraceSSGI/Scripts/Services.meta | 3 + .../HTraceSSGI/Scripts/Services/IService.cs | 8 + .../Scripts/Services/IService.cs.meta | 10 + .../Plugins/HTraceSSGI/Scripts/Wrappers.meta | 3 + .../Scripts/Wrappers/HDynamicBuffer.cs | 92 ++ .../Scripts/Wrappers/HDynamicBuffer.cs.meta | 10 + .../HTraceSSGI/Scripts/Wrappers/RTWrapper.cs | 105 ++ .../Scripts/Wrappers/RTWrapper.cs.meta | 10 + 203 files changed, 17634 insertions(+) create mode 100644 Assets/Plugins/HTraceSSGI.meta create mode 100644 Assets/Plugins/HTraceSSGI/HTraceSSGI Quick-Start Manual.pdf create mode 100644 Assets/Plugins/HTraceSSGI/HTraceSSGI Quick-Start Manual.pdf.meta create mode 100644 Assets/Plugins/HTraceSSGI/HTraceSSGI.asmdef create mode 100644 Assets/Plugins/HTraceSSGI/HTraceSSGI.asmdef.meta create mode 100644 Assets/Plugins/HTraceSSGI/Icons.meta create mode 100644 Assets/Plugins/HTraceSSGI/Icons/HTrace SSGI Icon.png create mode 100644 Assets/Plugins/HTraceSSGI/Icons/HTrace SSGI Icon.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Icons/Resources.meta create mode 100644 Assets/Plugins/HTraceSSGI/Icons/Resources/SSGI UI Card.png create mode 100644 Assets/Plugins/HTraceSSGI/Icons/Resources/SSGI UI Card.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise256.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise256.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise4.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise4.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile1SPP.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile1SPP.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile256SPP.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile256SPP.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile8SPP.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile8SPP.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScrambleNoise.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScrambleNoise.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile1SPP.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile1SPP.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile256SPP.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile256SPP.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile8SPP.png create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile8SPP.png.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader.meta create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader create mode 100644 Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat.meta create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat create mode 100644 Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Default.asset create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Default.asset.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Patcher.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Services.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Wrappers.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs.meta create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs create mode 100644 Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs.meta diff --git a/Assets/Plugins/HTraceSSGI.meta b/Assets/Plugins/HTraceSSGI.meta new file mode 100644 index 0000000..69e574b --- /dev/null +++ b/Assets/Plugins/HTraceSSGI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 772a801e4d7875842bc2f6e62abe5777 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/HTraceSSGI Quick-Start Manual.pdf b/Assets/Plugins/HTraceSSGI/HTraceSSGI Quick-Start Manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..db668f20cb0fbc550f7329396bfb9b19e91494e8 GIT binary patch literal 168657 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 z%0A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 z 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/HTraceSSGI/Icons/Resources/SSGI UI Card.png.meta b/Assets/Plugins/HTraceSSGI/Icons/Resources/SSGI UI Card.png.meta new file mode 100644 index 0000000..540f701 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Icons/Resources/SSGI UI Card.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: 794f3cf37bffa5b489c41a10a9f65492 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 1 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Icons/Resources/SSGI UI Card.png + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources.meta b/Assets/Plugins/HTraceSSGI/Resources.meta new file mode 100644 index 0000000..ee47674 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cd0d146c752f0f7489f7995e5e5499c9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI.meta new file mode 100644 index 0000000..07eda17 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 263aa0d227a83dc4ca6c2fc4192f02d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise.meta new file mode 100644 index 0000000..d70bae2 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4ee20b6f611369444acf19533acf34bb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise256.png b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise256.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6c446fee8a0bc9e0b41efc5b4772c5e680fe69 GIT binary patch literal 65960 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

0d##!vOkVn|GGFJ2)GFLrRY)nRwXz+-5E}{+- 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise4.png.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise4.png.meta new file mode 100644 index 0000000..94ad024 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise4.png.meta @@ -0,0 +1,137 @@ +fileFormatVersion: 2 +guid: 7708504b58552e441af54534c7810c94 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 0 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/OwenScrambledNoise4.png + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile1SPP.png b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile1SPP.png new file mode 100644 index 0000000000000000000000000000000000000000..3d16339172b42142d3ee099680c53214141f925f GIT binary patch literal 96 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 G=y- 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 RUNHaw002ovPDHLkV1nUj3LF3c literal 0 HcmV?d00001 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile256SPP.png.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile256SPP.png.meta new file mode 100644 index 0000000..ad90e7f --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile256SPP.png.meta @@ -0,0 +1,137 @@ +fileFormatVersion: 2 +guid: 2d193765922195249804503e5bf21bde +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 0 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile256SPP.png + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile8SPP.png b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/RankingTile8SPP.png new file mode 100644 index 0000000000000000000000000000000000000000..521166d4d1edce115a858667961ed3f28a38011b GIT binary patch literal 29706 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 dqu7^n~2&EKR3m2jlkhxrnDRJoKQ;nS>3TtVU0O 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

41F?hiLK16 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

*nj&7A}$wbIlZtuM%=a&ZJB7vS5>oqeSG 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

-WF&l02N*?-oiJ+Z1PIEmxo>#FK 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⩔Y+2F=H9_V+n-vLcE7owm%_8c@Bd1N{fF$)1 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%0Dv;dpdXGDQn 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%0AC4kn` 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile8SPP.png.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile8SPP.png.meta new file mode 100644 index 0000000..6f6e754 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile8SPP.png.meta @@ -0,0 +1,137 @@ +fileFormatVersion: 2 +guid: 447e554854bca1d4e822e506707c9f40 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 0 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/BlueNoise/ScramblingTile8SPP.png + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes.meta new file mode 100644 index 0000000..9d9c9c5 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 41620bce39125404eae8bf1b7d1dd7d9 +timeCreated: 1724756783 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute new file mode 100644 index 0000000..459e61b --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute @@ -0,0 +1,85 @@ +#pragma kernel CheckerboardClassification +#pragma kernel IndirectArguments + +#include "../Includes/HCommonSSGI.hlsl" +#pragma multi_compile _ _GBUFFER_NORMALS_OCT + +H_TEXTURE(_SampleCount); + +RWStructuredBuffer _RayCounter; +RWStructuredBuffer _RayCounter_Output; +RWStructuredBuffer _IndirectCoords_Output; +RWStructuredBuffer _IndirectArguments_Output; + +uint _RayTracedCounter; + +groupshared uint SharedRayAllocator; +groupshared uint SharedAllocationStartOffset; +groupshared uint2 SharedAllocatedRays[8 * 8]; + + +// ------------------------ CHECKERBOARD CLASSIFICATION ------------------------- +[numthreads(8, 8, 1)] +void CheckerboardClassification(uint3 pixCoord : SV_DispatchThreadID, uint2 groupThreadID : SV_GroupThreadID, uint groupIndex : SV_GroupIndex, uint2 groupID : SV_GroupID) +{ + + if (groupIndex == 0) SharedRayAllocator = 0; + GroupMemoryBarrierWithGroupSync(); + + uint IndirectCoordOffsetVR = _ScreenSize.x * _ScreenSize.y * pixCoord.z / _HScaleFactorSSGI; + uint RayCounterOffsetVR = 2 * pixCoord.z; + + float Samplecount = H_LOAD(_SampleCount, pixCoord.xy).x; + + bool CullCheckerboard = false; + if (((pixCoord.x + pixCoord.y) % 2 == 0 && uint(_FrameCount) % 2 == 0) || Samplecount <= 1) + CullCheckerboard = true; + if (((pixCoord.x + pixCoord.y) % 2 != 0 && uint(_FrameCount) % 2 != 0) || Samplecount <= 1) + CullCheckerboard = true; + + if (CullCheckerboard) + { + // uint Index = 0; + // InterlockedAdd(_RayCounter_Output[0 + RayCounterOffsetVR], 1, Index); + // _IndirectCoords_Output[Index + IndirectCoordOffsetVR] = pixCoord.xy; + + uint SharedTexelOffset; + InterlockedAdd(SharedRayAllocator, 1, SharedTexelOffset); + SharedAllocatedRays[SharedTexelOffset] = pixCoord.xy; + } + + GroupMemoryBarrierWithGroupSync(); + + uint ThreadIndex = groupThreadID.y * 8 + groupThreadID.x; + + if (ThreadIndex == 0) + { + InterlockedAdd(_RayCounter_Output[0 + RayCounterOffsetVR], SharedRayAllocator, SharedAllocationStartOffset); + } + + GroupMemoryBarrierWithGroupSync(); + + if (ThreadIndex < SharedRayAllocator) + { + _IndirectCoords_Output[SharedAllocationStartOffset + ThreadIndex + IndirectCoordOffsetVR] = SharedAllocatedRays[ThreadIndex]; + } +} + + +// ------------------------ INDIRECT ARGUMENTS GENERATION ------------------------- +[numthreads(1, 1, 1)] +void IndirectArguments(uint3 pixCoord : SV_DispatchThreadID, uint2 groupThreadID : SV_GroupThreadID, uint2 groupID : SV_GroupID) +{ + + uint IndirectArgumentsOffsetVR = 3 * pixCoord.z; + uint RayCounterOffsetVR = 2 * pixCoord.z; + + uint RayCounterBuffer = _RayCounter[0 + RayCounterOffsetVR]; + + _IndirectArguments_Output[0 + IndirectArgumentsOffsetVR] = (RayCounterBuffer + 63) / 64; + _IndirectArguments_Output[1 + IndirectArgumentsOffsetVR] = 1; + _IndirectArguments_Output[2 + IndirectArgumentsOffsetVR] = 1; + + _RayCounter[0 + RayCounterOffsetVR] = 0; + _RayCounter[1 + RayCounterOffsetVR] = RayCounterBuffer; +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute.meta new file mode 100644 index 0000000..7fde4e9 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 412aeb9af3abb33439c8084a878f56c2 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HCheckerboardingSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute new file mode 100644 index 0000000..ae7038c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute @@ -0,0 +1,116 @@ +#pragma kernel Debug + +#include "../Includes/HCommonSSGI.hlsl" +#include "../Includes/HFallbackSSGI.hlsl" +#pragma multi_compile _ _GBUFFER_NORMALS_OCT + +H_TEXTURE(_SampleCountSSGI); +H_TEXTURE(_HTraceBufferGI); + +H_RW_TEXTURE(float4, _Debug_Output); + +uint _DebugSwitch; +uint _BuffersSwitch; +float _IndirectLightingIntensity; + +void DebugFinal(uint3 pixCoord) +{ + if (_DebugSwitch == 1) + { + if (_BuffersSwitch == 0) // Multi + { + uint2 AuadSize = _ScreenSize.xy / 2; + uint2 AuadIndex = pixCoord.xy / AuadSize; // (0,0), (1,0), (0,1), (1,1) + uint2 LocalCoord = pixCoord.xy % AuadSize; + uint2 SampleCoord = LocalCoord * 2; + + float4 Output = float4(0, 0, 0, 1); + + if (HBUFFER_DEPTH(SampleCoord.xy) <= UNITY_RAW_FAR_CLIP_VALUE) + { + _Debug_Output[H_COORD(pixCoord.xy)] = Output; + return; + } + + if (AuadIndex.x == 0 && AuadIndex.y == 0) // Bottom Left + { + Output = float4(HBUFFER_NORMAL_WS(SampleCoord).xyz, 1); + } + else if (AuadIndex.x == 1 && AuadIndex.y == 0) // Bottom Right + { + float2 motionVector = HBUFFER_MOTION_VECTOR(SampleCoord).xy; + float motionMask = HBUFFER_MOTION_MASK(SampleCoord).x; + Output = float4(motionVector * 5, motionMask * 0.05, 1); + } + else if (AuadIndex.x == 0 && AuadIndex.y == 1) // Top Left + { + Output = float4(H_LINEAR_EYE_DEPTH(H_LOAD(g_HTraceDepthPyramidSSGI, SampleCoord).x).xxx / 20.0f, 1); + } + else if (AuadIndex.x == 1 && AuadIndex.y == 1) // Top Right + { + Output = float4(HBUFFER_DIFFUSE(SampleCoord).xyz, 1); + } + + _Debug_Output[H_COORD(pixCoord.xy)] = Output; + return; + } + + if (HBUFFER_DEPTH(pixCoord.xy) <= UNITY_RAW_FAR_CLIP_VALUE) + { + _Debug_Output[H_COORD(pixCoord.xy)] = 0; + return; + } + + if (_BuffersSwitch == 1) // Depth + { + _Debug_Output[H_COORD(pixCoord.xy)] = float4(H_LINEAR_EYE_DEPTH(H_LOAD(g_HTraceDepthPyramidSSGI, pixCoord.xy).x).xxx / 20.0f, 1); + } + if (_BuffersSwitch == 2) // Diffuse + { + _Debug_Output[H_COORD(pixCoord.xy)] = float4(HBUFFER_DIFFUSE(pixCoord.xy).xyz, 1); + } + if (_BuffersSwitch == 3) // Normal + { + _Debug_Output[H_COORD(pixCoord.xy)] = float4(HBUFFER_NORMAL_WS(pixCoord.xy).xyz, 1); + } + if (_BuffersSwitch == 4) // Motion Mask + { + _Debug_Output[H_COORD(pixCoord.xy)] = float4(HBUFFER_MOTION_MASK(pixCoord.xy).xxx, 1); + } + if (_BuffersSwitch == 5) // Motion Vectors + { + _Debug_Output[H_COORD(pixCoord.xy)] = float4(HBUFFER_MOTION_VECTOR(pixCoord.xy).xy * 5, 0, 1); + } + } + + if (HBUFFER_DEPTH(pixCoord.xy) <= UNITY_RAW_FAR_CLIP_VALUE) + { + float3 Sky = 0; + if (_DebugSwitch == 2) + Sky = EvaluateFallbackSky(H_GET_VIEW_VECTOR_WS((pixCoord.xy + 0.5f) * _ScreenSize.zw)); + + _Debug_Output[H_COORD(pixCoord.xy)] = float4(Sky, 1); + return; + } + if (_DebugSwitch == 2) + { + _Debug_Output[H_COORD(pixCoord.xy)] = HBUFFER_COLOR(pixCoord.xy); + } + if (_DebugSwitch == 3) + { + _Debug_Output[H_COORD(pixCoord.xy)] = H_LOAD(_HTraceBufferGI, pixCoord.xy) * _IndirectLightingIntensity; + } + if (_DebugSwitch == 4) + { + float Samplecount = H_LOAD(_SampleCountSSGI, pixCoord.xy / _HScaleFactorSSGI).x; + float3 Output = Samplecount < 1 ? float3(1,0,0) : Samplecount.xxx / 16.0f; + _Debug_Output[H_COORD(pixCoord.xy)] = float4(Output, 1); + } +} + +[numthreads(8, 8, 1)] +void Debug(uint3 pixCoord : SV_DispatchThreadID) +{ + + DebugFinal(pixCoord); +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute.meta new file mode 100644 index 0000000..1cf1945 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 163108b35413d864fa7afffcb87d9861 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HDebugSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute new file mode 100644 index 0000000..e6ca9d0 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute @@ -0,0 +1,343 @@ +#pragma kernel TemporalAccumulation +#pragma kernel TemporalStabilization +#pragma kernel PointDistributionFill +#pragma kernel SpatialFilter + +#pragma kernel SpatialFilter1 SpatialFilter = SpatialFilter1 +#pragma kernel SpatialFilter2 SpatialFilter = SpatialFilter2 SECOND_PASS + +#include "../Includes/HReservoirSSGI.hlsl" +#pragma multi_compile _ _GBUFFER_NORMALS_OCT +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl" + +#pragma multi_compile _ USE_SPATIAL_OCCLUSION +#pragma multi_compile _ USE_TEMPORAL_INVALIDITY +#pragma multi_compile _ INTERPOLATION_OUTPUT + +#define TEMPORAL_DENOISING_SAMPLECOUNT 16 +#define TEMPORAL_STABILIZATION_SAMPLECOUNT 16 + +H_TEXTURE(_Radiance); +H_TEXTURE(_NormalDepth); +H_TEXTURE(_AmbientOcclusion); +H_TEXTURE(_SpatialGuidance); +H_TEXTURE(_RadianceReprojected); +H_TEXTURE(_TemporalInvalidity); +H_TEXTURE(_SamplecountReprojected); +H_TEXTURE(_SpatialOcclusion); + +H_RW_TEXTURE(float4, _Radiance_TemporalOutput); +H_RW_TEXTURE(float3, _Radiance_SpatialOutput); +H_RW_TEXTURE(float3, _Radiance_Output); +H_RW_TEXTURE(float, _Samplecount_Output); +H_RW_TEXTURE(uint2, _RadianceNormalDepth_Output); + +StructuredBuffer _PointDistribution; +RWStructuredBuffer _PointDistribution_Output; + +float _FilterRadius; +float _FilterAdaptivity; + + +// ------------------------ TEMPORAL FUNCTIONS ------------------------- +float3 DirectClipToAABB(float3 History, float3 Min, float3 Max) +{ + float3 Center = 0.5 * (Max + Min); + float3 Extents = 0.5 * (Max - Min); + + float3 Offset = History - Center; + float3 Vunit = Offset.xyz / Extents.xyz; + float3 AbsUnit = abs(Vunit); + float MaxUnit = max(max(AbsUnit.x, AbsUnit.y), AbsUnit.z); + + if (MaxUnit > 1.0) return Center + (Offset / MaxUnit); + else return History; +} + + +// ------------------------ POINT DISTRIBUTION BUFFER -------------------- +[numthreads(128, 1, 1)] +void PointDistributionFill(uint pixCoord : SV_DispatchThreadID) +{ + // _PointDistribution_Output[pixCoord.x] = HSampleDiskCubic(GetLDSequenceSampleFloat(pixCoord.x, 0), GetLDSequenceSampleFloat(pixCoord.x, 1)); + + static const float3 k_PoissonDiskSamples[8] = + { + // https://www.desmos.com/calculator/abaqyvswem + float3( -1.00 , 0.00 , 1.0 ), + float3( 0.00 , 1.00 , 1.0 ), + float3( 1.00 , 0.00 , 1.0 ), + float3( 0.00 , -1.00 , 1.0 ), + float3( -0.25 * sqrt(2.0) , 0.25 * sqrt(2.0) , 0.5 ), + float3( 0.25 * sqrt(2.0) , 0.25 * sqrt(2.0) , 0.5 ), + float3( 0.25 * sqrt(2.0) , -0.25 * sqrt(2.0) , 0.5 ), + float3( -0.25 * sqrt(2.0) , -0.25 * sqrt(2.0) , 0.5 ) + }; + + int i = pixCoord; + uint JitterIndex = (uint(_FrameCount) % 8) + i; + float2 SampleJitter = SampleUnitDisk(JitterIndex) * 0.15; + + // 8 offsets with jitter + if (pixCoord.x < 8) + { + float3 Sample = k_PoissonDiskSamples[i]; + Sample.xy += SampleJitter; + + _PointDistribution_Output[i] = Sample; + } + + // 8 offsets without jitter + if (pixCoord.x >= 8 && pixCoord.x < 16) + { + _PointDistribution_Output[i] = k_PoissonDiskSamples[i - 8]; + } +} + + +// ------------------------ TEMPORAL ACCUMULATION ------------------------ +[numthreads(8, 8, 1)] +void TemporalAccumulation(uint3 pixCoord : SV_DispatchThreadID) +{ + + float3 Radiance = H_LOAD(_Radiance, pixCoord.xy).xyz; + float3 RadianceHistory = H_LOAD(_RadianceReprojected, pixCoord.xy).xyz; + + float3 Moment1 = Radiance; + float3 Moment2 = Radiance * Radiance; + float WeightTotal = 1.0; + + float CenterLuminance = Luminance(Radiance); + float MaxLuma = -9999; float MinLuma = 9999; + float3 MaxLumaSample, MinLumaSample; + + const static int2 SampleOffsets[8] = {int2(1, 0), int2(0, 1), int2(-1, 0), int2(0, -1), int2(1, -1), int2(-1, 1), int2(-1, -1), int2(1, 1)}; + + for (int i = 0; i < 8; i++) + { + int2 Offset = SampleOffsets[i]; + + float Weight = exp(-3.0 * float(Offset.x * Offset.x + Offset.y * Offset.y) / 4.0f); + float3 Sample = H_LOAD(_Radiance, pixCoord.xy + Offset * 1).xyz; + Moment1 += Sample * Weight; + Moment2 += Sample * Sample * Weight; + WeightTotal += Weight; + + float SampleLuma = Luminance(Sample); + if (MaxLuma < SampleLuma) { MaxLuma = SampleLuma; MaxLumaSample = Sample; } + if (MinLuma > SampleLuma) { MinLuma = SampleLuma; MinLumaSample = Sample; } + } + + Moment1 /= WeightTotal; + Moment2 /= WeightTotal; + float3 StdDev = sqrt(max(0.0, Moment2 - Moment1 * Moment1)); + + float2 TemporalInvalidity = 1; + if (USE_TEMPORAL_INVALIDITY) + { + TemporalInvalidity = H_LOAD(_TemporalInvalidity, pixCoord.xy).xy; + TemporalInvalidity.x = pow(TemporalInvalidity.x, 5); + TemporalInvalidity.y = TemporalInvalidity.y < 0.95f ? 0 : TemporalInvalidity.y; + } + + float ClampBoxSize = 0.5; + float ClampBoxMultiplier = lerp(1, 5, TemporalInvalidity.x); + float3 Min = lerp(Radiance, Moment1, ClampBoxSize * ClampBoxSize) - StdDev * ClampBoxSize * ClampBoxMultiplier; + float3 Max = lerp(Radiance, Moment1, ClampBoxSize * ClampBoxSize) + StdDev * ClampBoxSize * ClampBoxMultiplier; + + RadianceHistory = DirectClipToAABB(RadianceHistory, Min, Max); + + float SamplecountReprojected = H_LOAD(_SamplecountReprojected, pixCoord.xy).x; + float Samplecount = min(TEMPORAL_DENOISING_SAMPLECOUNT, SamplecountReprojected + 1); + float TemporalWeight = 1.0f - (1.0f / float(Samplecount)); + + if (ENABLE_RCRS_FILTER) + { + if (CenterLuminance >= MinLuma && CenterLuminance <= MaxLuma) { Radiance = Radiance;} + else if (CenterLuminance > MaxLuma) { Radiance = MaxLumaSample; } + else { Radiance = MinLumaSample; } + } + + if (ENABLE_EXPOSURE_CONTROL) + { + float ExposurePrevious = HGetPreviousExposureMultiplier; + float ExposureCurrent = HGetCurrentExposureMultiplier; + + float ExposureRatio = (ExposurePrevious * ExposureCurrent) != 0.0 ? ExposureCurrent / ExposurePrevious : 100.0; + + if (max(ExposureRatio, 1.0 / ExposureRatio) > 2.0) + TemporalWeight = 0; + } + + Radiance = lerp(Radiance, RadianceHistory, TemporalWeight * TemporalInvalidity.y * ENABLE_TEMPORAL_DENOISING); + + _Radiance_TemporalOutput[H_COORD(pixCoord.xy)] = float4(Radiance, 0); + _Radiance_SpatialOutput[H_COORD(pixCoord.xy)] = Radiance; + _Samplecount_Output[H_COORD(pixCoord.xy)] = Samplecount; +} + + +// ------------------------ TEMPORAL STABILIZATION ------------------------ +[numthreads(8, 8, 1)] +void TemporalStabilization(uint3 pixCoord : SV_DispatchThreadID) +{ + + float3 Radiance = H_LOAD(_Radiance, pixCoord.xy).xyz; + float4 RadianceSamplecountHistory = H_LOAD(_RadianceReprojected, pixCoord.xy); + + float3 Moment1 = Radiance; + float3 Moment2 = Radiance * Radiance; + float WeightTotal = 1.0; + + const static int2 SampleOffsets[8] = {int2(1, 0), int2(0, 1), int2(-1, 0), int2(0, -1), int2(1, -1), int2(-1, 1), int2(-1, -1), int2(1, 1)}; + + for (int i = 0; i < 8; i++) + { + int2 Offset = SampleOffsets[i]; + + float Weight = exp(-3.0 * float(Offset.x * Offset.x + Offset.y * Offset.y) / 4.0f); + float3 Sample = H_LOAD(_Radiance, pixCoord.xy + Offset * 1).xyz; + Moment1 += Sample * Weight; + Moment2 += Sample * Sample * Weight; + WeightTotal += Weight; + } + + Moment1 /= WeightTotal; + Moment2 /= WeightTotal; + float3 StdDev = sqrt(max(0.0, Moment2 - Moment1 * Moment1)); + + float2 TemporalInvalidity = 1; + if (USE_TEMPORAL_INVALIDITY) + { + TemporalInvalidity = H_LOAD(_TemporalInvalidity, pixCoord.xy / _HScaleFactorSSGI).xy; + TemporalInvalidity.x = pow(TemporalInvalidity.x, 5); + TemporalInvalidity.y = TemporalInvalidity.y < 0.95f ? 0 : TemporalInvalidity.y; + } + + float ClampBoxSize = 0.5; + float ClampBoxMultiplier = lerp(3, 6, TemporalInvalidity.x * 2); + float3 Min = lerp(Radiance, Moment1, ClampBoxSize * ClampBoxSize) - StdDev * ClampBoxSize * ClampBoxMultiplier; + float3 Max = lerp(Radiance, Moment1, ClampBoxSize * ClampBoxSize) + StdDev * ClampBoxSize * ClampBoxMultiplier; + + RadianceSamplecountHistory.xyz = DirectClipToAABB(RadianceSamplecountHistory.xyz, Min, Max); + + float Samplecount = min(TEMPORAL_STABILIZATION_SAMPLECOUNT, RadianceSamplecountHistory.w + 1); + float TemporalWeight = 1.0f - (1.0f / float(Samplecount)); + + if (ENABLE_EXPOSURE_CONTROL) + { + float ExposurePrevious = HGetPreviousExposureMultiplier; + float ExposureCurrent = HGetCurrentExposureMultiplier; + + float ExposureRatio = (ExposurePrevious * ExposureCurrent) != 0.0 ? ExposureCurrent / ExposurePrevious : 100.0; + + if (max(ExposureRatio, 1.0 / ExposureRatio) > 2.0) + TemporalWeight = 0; + } + + Radiance = lerp(Radiance, RadianceSamplecountHistory.xyz, TemporalWeight * TemporalInvalidity.y * ENABLE_TEMPORAL_STABILIZATION); + + _Radiance_TemporalOutput[H_COORD(pixCoord.xy)] = float4(Radiance.xyz, Samplecount.x); +} + + +// ------------------------ SPATIAL FILTER ------------------------ +[numthreads(8, 8, 1)] +void SpatialFilter(uint3 pixCoord : SV_DispatchThreadID) +{ + + uint2 pixCoordUnscaled = GetUnscaledCoords(pixCoord.xy); + int2 pixCoordMax = _ScreenSize.xy / _HScaleFactorSSGI.xx - 1; + float2 pixCoordNDC = (float2(pixCoordUnscaled) + 0.5f) * _ScreenSize.zw; + + uint NormalDepthPacked = asuint(H_LOAD(_NormalDepth, pixCoord.xy).x); + float4 NormalDepth = UnpackNormalDepth(NormalDepthPacked); + + if (NormalDepth.w <= UNITY_RAW_FAR_CLIP_VALUE) { return; } + + float3 Radiance = H_LOAD(_Radiance, pixCoord.xy).xyz; + Radiance = SpatialDenoisingTonemap(Radiance); + + float DepthCetnerLinear = H_LINEAR_EYE_DEPTH(NormalDepth.w); + float3 NormalCenterVS = H_TRANSFORM_WORLD_TO_VIEW_NORMAL(NormalDepth.xyz); + float3 PositionCenterWS = H_COMPUTE_POSITION_WS(pixCoordNDC, NormalDepth.w, H_MATRIX_I_VP); + float3 PositionCenterVS = ComputeFastViewSpacePosition(pixCoordNDC, NormalDepth.w, DepthCetnerLinear); + float4 NormalPlaneVS = float4(NormalCenterVS.xyz, dot(PositionCenterVS, NormalCenterVS.xyz)); + float SpatialOcclusionCenter = H_LOAD(_SpatialOcclusion, pixCoord.xy).x; + + uint2 SpatialGuidancePacked = asuint(H_LOAD(_SpatialGuidance, pixCoord.xy).xy); + float AdaptiveFilterScale = UnpackAmbientOcclusion(SpatialGuidancePacked.y); + float AdaptivePlaneWeight = lerp(500.0f, 100.0f, AdaptiveFilterScale); + uint SpatialGuidance = SpatialGuidancePacked.x; + + float FilterRadius = _FilterRadius / 2.0f; + #ifdef SECOND_PASS + FilterRadius = _FilterRadius; + #endif + + float MinFilterRadius = lerp(0.01f, 0.1f, H_LOAD(_AmbientOcclusion, pixCoord.xy).x); + FilterRadius = max(MinFilterRadius, lerp(FilterRadius, FilterRadius * AdaptiveFilterScale, _FilterAdaptivity)); + + float DistanceToPoint = length(H_GET_ABSOLUTE_POSITION_WS(PositionCenterWS) - H_GET_CAMERA_POSITION_WS()); + float3x3 OrthoBasis = HGetLocalFrame(NormalDepth.xyz); + float RadiusScale = lerp(5.0f, 50.0f, saturate(DistanceToPoint / 500.0f)); + float Radius = DistanceToPoint * FilterRadius / RadiusScale; + float Sigma = 0.9f * Radius; + + float WeightAccumulated = 1; + + float2 PerPixelJitter; + PerPixelJitter.x = HInterleavedGradientNoise(pixCoord.xy, 0); + PerPixelJitter.y = HInterleavedGradientNoise(pixCoord.yx, 1); + PerPixelJitter = (PerPixelJitter * 2 - 1) * 0.15; + + UNITY_UNROLL + for (int i = 0; i < 8; i++) + { + float GuidanceAdaptivity = 1 - (0.75 * ((SpatialGuidance >> i) & 0x1)); + float2 Point = (_PointDistribution[i + 8].xy + PerPixelJitter) * Radius * GuidanceAdaptivity; + + float3 PositionPointWS = PositionCenterWS + OrthoBasis[0] * Point.x + OrthoBasis[1] * Point.y; + float2 SampleCoordNDC = H_COMPUTE_NDC_Z(PositionPointWS, H_MATRIX_VP).xy; + int2 SampleCoord = SampleCoordNDC * _ScreenSize.xy / _HScaleFactorSSGI; + + int2 Overshoot = max(SampleCoord - pixCoordMax, 0); + SampleCoord -= 2 * Overshoot; + + uint NormalDepthPacked = asuint(H_LOAD(_NormalDepth, SampleCoord).x); + float4 NormalDepthSample = UnpackNormalDepth(NormalDepthPacked); + float SpatialOcclusionSample = H_LOAD(_SpatialOcclusion, SampleCoord).x; + + float3 PositionSampleVS = ComputeFastViewSpacePosition(SampleCoordNDC, NormalDepthSample.w, H_LINEAR_EYE_DEPTH(NormalDepthSample.w)); + float PlaneWeight = ProbePlaneWeighting(NormalPlaneVS, PositionSampleVS, DepthCetnerLinear, AdaptivePlaneWeight); + + float NormalWeight = saturate(dot(NormalDepth.xyz, NormalDepthSample.xyz)); + float GaussianWeight = GaussianWeighting(length(Point), Sigma); + float OcclusionWeight = 1.0f; + + if (USE_SPATIAL_OCCLUSION) + { OcclusionWeight = exp2(-max(5, 10 * (1 - SpatialOcclusionCenter)) * abs(SpatialOcclusionCenter - SpatialOcclusionSample)); } + + float SampleWeight = NormalWeight * PlaneWeight * OcclusionWeight * GaussianWeight * ENABLE_SPATIAL_DENOISING; + WeightAccumulated += SampleWeight; + + float3 RadianceSample = H_LOAD(_Radiance, SampleCoord).xyz; + RadianceSample = SpatialDenoisingTonemap(RadianceSample); + Radiance += RadianceSample * SampleWeight; + } + + Radiance /= WeightAccumulated; + Radiance = SpatialDenoisingTonemapInverse(Radiance); + + if (AnyIsNaN(Radiance) || AnyIsInf(Radiance)) + Radiance = 0; + + // Radiance = AdaptiveFilterScale; + + #if SECOND_PASS + if (INTERPOLATION_OUTPUT) _RadianceNormalDepth_Output[H_COORD(pixCoord.xy)] = uint2(PackToR11G11B10f(Radiance), PackNormalDepth(NormalDepth.xyz, NormalDepth.w)); + else _Radiance_Output[H_COORD(pixCoord.xy)] = Radiance; + #else + _Radiance_Output[H_COORD(pixCoord.xy)] = Radiance; + #endif +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute.meta new file mode 100644 index 0000000..fb6da3d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 4e9dcd36d21eeca4a93de42f47c188ce +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HDenoiserSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute new file mode 100644 index 0000000..be6a6bc --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute @@ -0,0 +1,115 @@ +#pragma kernel GenerateDepthPyramid + +#include "../Includes/HCommonSSGI.hlsl" + +H_RW_TEXTURE(float, _DepthPyramid_OutputMIP0); +H_RW_TEXTURE(float, _DepthPyramid_OutputMIP1); +H_RW_TEXTURE(float, _DepthPyramid_OutputMIP2); +H_RW_TEXTURE(float, _DepthPyramid_OutputMIP3); +H_RW_TEXTURE(float, _DepthPyramid_OutputMIP4); + +groupshared float MipDepthLDS[8][8]; + +float DepthFilter(float4 DepthSamples) +{ + float DepthFiltered = 0; + + // Change filtering to max near sky pixels, to grab more skylight + if (any(DepthSamples <= 0)) + DepthFiltered = max(max(DepthSamples.x, DepthSamples.y), max(DepthSamples.z, DepthSamples.w)); + + DepthFiltered = min(min(DepthSamples.x, DepthSamples.y), min(DepthSamples.z, DepthSamples.w)); + + return DepthFiltered; +} + + +// ------------------------ MIP LEVEL 0-4 GENERATIONS ------------------------ +[numthreads(8, 8, 1)] +void GenerateDepthPyramid(uint3 pixCoord : SV_DispatchThreadID, uint2 groupThreadID : SV_GroupThreadID) +{ + + const uint2 originalCoord = pixCoord.xy; + pixCoord *= 2; + + float4 Depth; + Depth.x = any(pixCoord.xy + uint2(0,0) >= uint2(_ScreenSize.xy)) ? 0 : HBUFFER_DEPTH(pixCoord.xy + uint2(0,0)).x; + Depth.y = any(pixCoord.xy + uint2(1,0) >= uint2(_ScreenSize.xy)) ? 0 : HBUFFER_DEPTH(pixCoord.xy + uint2(1,0)).x; + Depth.z = any(pixCoord.xy + uint2(0,1) >= uint2(_ScreenSize.xy)) ? 0 : HBUFFER_DEPTH(pixCoord.xy + uint2(0,1)).x; + Depth.w = any(pixCoord.xy + uint2(1,1) >= uint2(_ScreenSize.xy)) ? 0 : HBUFFER_DEPTH(pixCoord.xy + uint2(1,1)).x; + + Depth.x = Depth.x >= 0.9999f ? 0 : Depth.x; + Depth.y = Depth.y >= 0.9999f ? 0 : Depth.y; + Depth.z = Depth.z >= 0.9999f ? 0 : Depth.z; + Depth.w = Depth.w >= 0.9999f ? 0 : Depth.w; + + if (HBUFFER_RENDER_LAYER_MASK(pixCoord.xy + uint2(0,0)) & _ExcludeCastingLayerMaskSSGI) Depth.x = -1; + if (HBUFFER_RENDER_LAYER_MASK(pixCoord.xy + uint2(1,0)) & _ExcludeCastingLayerMaskSSGI) Depth.y = -1; + if (HBUFFER_RENDER_LAYER_MASK(pixCoord.xy + uint2(0,1)) & _ExcludeCastingLayerMaskSSGI) Depth.z = -1; + if (HBUFFER_RENDER_LAYER_MASK(pixCoord.xy + uint2(1,1)) & _ExcludeCastingLayerMaskSSGI) Depth.w = -1; + + // Write to MIP0 + _DepthPyramid_OutputMIP0[H_COORD(pixCoord.xy + uint2(0, 0))] = Depth.x; + _DepthPyramid_OutputMIP0[H_COORD(pixCoord.xy + uint2(1, 0))] = Depth.y; + _DepthPyramid_OutputMIP0[H_COORD(pixCoord.xy + uint2(0, 1))] = Depth.z; + _DepthPyramid_OutputMIP0[H_COORD(pixCoord.xy + uint2(1, 1))] = Depth.w; + + float DepthMIP1 = DepthFilter(Depth.xyzw); + + // Write to MIP1 + _DepthPyramid_OutputMIP1[H_COORD(originalCoord)] = DepthMIP1; + + MipDepthLDS[groupThreadID.x][groupThreadID.y] = DepthMIP1; + GroupMemoryBarrierWithGroupSync(); + + // Write to MIP2 + [branch] + if (all((groupThreadID.xy % int2(2, 2)) == 0)) + { + float4 Depth; + Depth.x = MipDepthLDS[groupThreadID.x + 0][groupThreadID.y + 0]; + Depth.y = MipDepthLDS[groupThreadID.x + 1][groupThreadID.y + 0]; + Depth.z = MipDepthLDS[groupThreadID.x + 0][groupThreadID.y + 1]; + Depth.w = MipDepthLDS[groupThreadID.x + 1][groupThreadID.y + 1]; + + float DepthMIP2 = DepthFilter(Depth.xyzw); + + _DepthPyramid_OutputMIP2[H_COORD(originalCoord / 2)] = DepthMIP2; + MipDepthLDS[groupThreadID.x][groupThreadID.y] = DepthMIP2; + } + + GroupMemoryBarrierWithGroupSync(); + + // Write to MIP3 + [branch] + if (all((groupThreadID.xy % int2(4, 4)) == 0)) + { + float4 Depth; + Depth.x = MipDepthLDS[groupThreadID.x + 0][groupThreadID.y + 0]; + Depth.y = MipDepthLDS[groupThreadID.x + 2][groupThreadID.y + 0]; + Depth.z = MipDepthLDS[groupThreadID.x + 0][groupThreadID.y + 2]; + Depth.w = MipDepthLDS[groupThreadID.x + 2][groupThreadID.y + 2]; + + float DepthMIP3 = DepthFilter(Depth.xyzw); + + _DepthPyramid_OutputMIP3[H_COORD(originalCoord / 4)] = DepthMIP3; + MipDepthLDS[groupThreadID.x][groupThreadID.y] = DepthMIP3; + } + + GroupMemoryBarrierWithGroupSync(); + + // Write to MIP4 + [branch] + if (all((groupThreadID.xy % int2(8, 8)) == 0)) + { + float4 Depth; + Depth.x = MipDepthLDS[groupThreadID.x + 0][groupThreadID.y + 0]; + Depth.y = MipDepthLDS[groupThreadID.x + 4][groupThreadID.y + 0]; + Depth.z = MipDepthLDS[groupThreadID.x + 0][groupThreadID.y + 4]; + Depth.w = MipDepthLDS[groupThreadID.x + 4][groupThreadID.y + 4]; + + float DepthMIP4 = DepthFilter(Depth.xyzw); + + _DepthPyramid_OutputMIP4[H_COORD(originalCoord / 8)] = DepthMIP4; + } +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute.meta new file mode 100644 index 0000000..5595945 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 902b874ab8f513d4cbe65d1bfb2e9d24 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HDepthPyramid.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute new file mode 100644 index 0000000..9f94465 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute @@ -0,0 +1,215 @@ +#pragma kernel Interpolation + +#include "../Includes/HReservoirSSGI.hlsl" +#pragma multi_compile _ _GBUFFER_NORMALS_OCT + +#define INTERPOLATION_LANCZOS 0 +#define INTERPOLATION_SAMPLECOUNT 5 +#define NORMAL_REJECTION 1 + +H_TEXTURE(_RadianceNormalDepth); + +H_RW_TEXTURE(float3, _Radiance_Output); +H_RW_TEXTURE(uint, _NormalDepth_HistoryOutput); + + +// ------------------------ INTERPOLATION STRUCTS ----------------------- +struct CenterPixelData +{ + float4 Plane; + float3 Normal; + float DepthLinear; +}; + + +// ------------------------ LANCZOS-SPECIFIC FUNCTIONS ------------------------- +float4 ProcessSample(float2 Offset, float4 DirectionLength, float2 LobeClip, float4 RadianceSample) +{ + float2 RotatedOffset = float2(dot(Offset, DirectionLength.xy), dot(Offset, float2(-DirectionLength.y, DirectionLength.x))) * DirectionLength.zw; + float DistanceDouble = min(dot(RotatedOffset, RotatedOffset), LobeClip.y); + + float Window = 0.4 * DistanceDouble - 1.0; + float Base = LobeClip.x * DistanceDouble - 1.0; + Window *= Window; + Base *= Base; + Window = 1.5625 * Window - 0.5625; + float Weight = Window * Base * RadianceSample.w; + + float4 AccumulatedData; + AccumulatedData.xyz = RadianceSample.xyz * Weight; + AccumulatedData.w = Weight; + + return AccumulatedData; +} + + +void GatherData(inout float2 Direction, inout float Length, float Weight, float SampleA, float SampleB, float SampleC, float SampleD, float SampleE) +{ + float LengthX = max(abs(SampleD.x - SampleC.x), abs(SampleC.x - SampleB.x)); + float DirectionX = SampleD.x - SampleB.x; + Direction.x += DirectionX * Weight; + LengthX = clamp(abs(DirectionX)/ LengthX, 0.0, 1.0); + LengthX *= LengthX; + Length += LengthX * Weight; + + float LengthY = max(abs(SampleE.x - SampleC.x), abs(SampleC.x - SampleA.x)); + float DirectionY = SampleE.x - SampleA.x; + Direction.y += DirectionY * Weight; + LengthY = clamp(abs(DirectionY) / LengthY, 0.0, 1.0); + LengthY *= LengthY; + Length += LengthY * Weight; +} + + +void AdaptiveLanczosData(float Samples[12], float2 PixelCoord, inout float4 DirLength, inout float2 LobeClip) +{ + float Length = 0; + float2 Direction = 0; + GatherData(Direction, Length, (1.0 -PixelCoord.x) * (1.0 -PixelCoord.y), Samples[0], Samples[5], Samples[4], Samples[9], Samples[3]); + GatherData(Direction, Length, PixelCoord.x * (1.0 -PixelCoord.y), Samples[1], Samples[4], Samples[9], Samples[8], Samples[6]); + GatherData(Direction, Length, (1.0 -PixelCoord.x) * PixelCoord.y, Samples[4], Samples[2], Samples[3], Samples[6], Samples[11]); + GatherData(Direction, Length, PixelCoord.x * PixelCoord.y, Samples[9], Samples[3], Samples[6], Samples[7], Samples[10]); + + float2 DirectionDouble = Direction * Direction; + float DirectionRadial = DirectionDouble.x + DirectionDouble.y; + bool IsNearZero = DirectionRadial < (1.0 / 32768.0); + DirectionRadial = rsqrt(DirectionRadial); + DirectionRadial = IsNearZero ? 1.0 : DirectionRadial; + Direction.x = IsNearZero ? 1.0 : Direction.x; + Direction *= float2(DirectionRadial, DirectionRadial); + Length = Length * 0.5; + Length *= Length; + + float Stretch = dot(Direction,Direction) / (max(abs(Direction.x), abs(Direction.y))); + float2 LengthDouble = float2(1.0 + (Stretch -1.0) * Length, 1.0 - 0.5 * Length); + float NegativeLobe = 0.5 - 0.29 * Length; + float Clip = 1.0 / NegativeLobe; + + DirLength = float4(Direction.xy, LengthDouble.xy); + LobeClip = float2(NegativeLobe, Clip); +} + + +float4 InterpolationSample(CenterPixelData CenterData, int2 SampleCoord, inout float LumaSample) +{ + uint2 RadianceNormalDepthPacked = asuint(H_LOAD(_RadianceNormalDepth, SampleCoord).xy); + float3 RadianceSample = UnpackFromR11G11B10f(RadianceNormalDepthPacked.x); + float4 NormalDepthSample = UnpackNormalDepth(RadianceNormalDepthPacked.y); + + float3 WorldPos = ComputeFastViewSpacePosition((SampleCoord * _HScaleFactorSSGI + 0.5) / _ScreenSize.xy, NormalDepthSample.w, H_LINEAR_EYE_DEPTH(NormalDepthSample.w)); + float PlaneWeight = ProbePlaneWeighting(CenterData.Plane, WorldPos, CenterData.DepthLinear, 5000); + float NormalWeight = 1; + + if (NORMAL_REJECTION) + NormalWeight = saturate(dot(CenterData.Normal, NormalDepthSample.xyz)); + + LumaSample = Luminance(RadianceSample) * PlaneWeight * NormalWeight; + return float4(RadianceSample, PlaneWeight * NormalWeight); +} + + +// ------------------------ INTERPOLATION ----------------------- +[numthreads(8, 8, 1)] +void Interpolation(uint3 pixCoord : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex, uint groupID : SV_GroupID) +{ + + const float DepthCenter = HBUFFER_DEPTH(pixCoord.xy).x; + if (DepthCenter <= 1e-7) { return; } + + const uint RadiancePacked = asuint(H_LOAD(_RadianceNormalDepth, floor(pixCoord.xy / _HScaleFactorSSGI)).x); + float3 RadianceCenter = UnpackFromR11G11B10f(RadiancePacked); + + const float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoord.xy).xyz; + const float3 NormalCenterVS = H_TRANSFORM_WORLD_TO_VIEW_NORMAL(NormalCenterWS); + const float3 WorldPosCenter = ComputeFastViewSpacePosition((pixCoord.xy + 0.5f) * _ScreenSize.zw, DepthCenter, H_LINEAR_EYE_DEPTH(DepthCenter)); + const int2 SampleOffsets[9] = {int2(0, 0), int2(1, 0), int2(0, 1), int2(-1, 0), int2(0, -1), int2(1, -1), int2(-1, 1), int2(-1, -1), int2(1, 1)}; + + CenterPixelData CenterData; + CenterData.Normal = NormalCenterWS; + CenterData.Plane = float4(NormalCenterVS, dot(WorldPosCenter, NormalCenterVS)); + CenterData.DepthLinear = H_LINEAR_EYE_DEPTH(DepthCenter); + + float3 InterpolatedRadiance = 0; + uint Count = 0; + + if (INTERPOLATION_LANCZOS) + { + float2 LanczosOffset = float2(pixCoord.xy) / _HScaleFactorSSGI; LanczosOffset -= floor(LanczosOffset); + int2 LanczosOffsetRounded = -floor(LanczosOffset ); + int2 DownscaledRes = floor(pixCoord.xy / _HScaleFactorSSGI); + + float4 Samples[12]; + float LumaSamples[12]; + + Samples[0] = InterpolationSample(CenterData, DownscaledRes + int2( 0,-1) + LanczosOffsetRounded, LumaSamples[0] ); + Samples[1] = InterpolationSample(CenterData, DownscaledRes + int2( 1,-1) + LanczosOffsetRounded, LumaSamples[1] ); + Samples[2] = InterpolationSample(CenterData, DownscaledRes + int2(-1, 1) + LanczosOffsetRounded, LumaSamples[2] ); + Samples[3] = InterpolationSample(CenterData, DownscaledRes + int2( 0, 1) + LanczosOffsetRounded, LumaSamples[3] ); + Samples[4] = InterpolationSample(CenterData, DownscaledRes + int2( 0, 0) + LanczosOffsetRounded, LumaSamples[4] ); + Samples[5] = InterpolationSample(CenterData, DownscaledRes + int2(-1, 0) + LanczosOffsetRounded, LumaSamples[5] ); + Samples[6] = InterpolationSample(CenterData, DownscaledRes + int2( 1, 1) + LanczosOffsetRounded, LumaSamples[6] ); + Samples[7] = InterpolationSample(CenterData, DownscaledRes + int2( 2, 1) + LanczosOffsetRounded, LumaSamples[7] ); + Samples[8] = InterpolationSample(CenterData, DownscaledRes + int2( 2, 0) + LanczosOffsetRounded, LumaSamples[8] ); + Samples[9] = InterpolationSample(CenterData, DownscaledRes + int2( 1, 0) + LanczosOffsetRounded, LumaSamples[9] ); + Samples[10] = InterpolationSample(CenterData, DownscaledRes + int2( 1, 2) + LanczosOffsetRounded, LumaSamples[10]); + Samples[11] = InterpolationSample(CenterData, DownscaledRes + int2( 0, 2) + LanczosOffsetRounded, LumaSamples[11]); + + float4 DirLength; float2 LobeClip; + AdaptiveLanczosData(LumaSamples, LanczosOffset, DirLength, LobeClip); + + float3 MinNeighbourhood = min(min(Samples[4].xyz, Samples[9].xyz), min(Samples[3].xyz, Samples[6].xyz)); + float3 MaxNeighbourhood = max(max(Samples[4].xyz, Samples[9].xyz), max(Samples[3].xyz, Samples[6].xyz)); + + float4 AccumulatedData = 0; + AccumulatedData += ProcessSample(float2( 0,-1) -LanczosOffset, DirLength, LobeClip, Samples[0]); + AccumulatedData += ProcessSample(float2( 1,-1) -LanczosOffset, DirLength, LobeClip, Samples[1]); + AccumulatedData += ProcessSample(float2(-1, 1) -LanczosOffset, DirLength, LobeClip, Samples[2]); + AccumulatedData += ProcessSample(float2( 0, 1) -LanczosOffset, DirLength, LobeClip, Samples[3]); + AccumulatedData += ProcessSample(float2( 0, 0) -LanczosOffset, DirLength, LobeClip, Samples[4]); + AccumulatedData += ProcessSample(float2(-1, 0) -LanczosOffset, DirLength, LobeClip, Samples[5]); + AccumulatedData += ProcessSample(float2( 1, 1) -LanczosOffset, DirLength, LobeClip, Samples[6]); + AccumulatedData += ProcessSample(float2( 2, 1) -LanczosOffset, DirLength, LobeClip, Samples[7]); + AccumulatedData += ProcessSample(float2( 2, 0) -LanczosOffset, DirLength, LobeClip, Samples[8]); + AccumulatedData += ProcessSample(float2( 1, 0) -LanczosOffset, DirLength, LobeClip, Samples[9]); + AccumulatedData += ProcessSample(float2( 1, 2) -LanczosOffset, DirLength, LobeClip, Samples[10]); + AccumulatedData += ProcessSample(float2( 0, 2) -LanczosOffset, DirLength, LobeClip, Samples[11]); + + AccumulatedData.w = max(AccumulatedData.w, 0.1f); + AccumulatedData.xyz = AccumulatedData.w > 0 ? AccumulatedData.xyz / AccumulatedData.w : RadianceCenter; + InterpolatedRadiance = min(MaxNeighbourhood, max(MinNeighbourhood, AccumulatedData.xyz )); + } + else + { + static const int2 SampleOffsets[9] = {int2(0, 0), int2(1, 0), int2(0, 1), int2(-1, 0), int2(0, -1), int2(1, -1), int2(-1, 1), int2(-1, -1), int2(1, 1)}; + + float2 pixCoordDownscaled = float2(pixCoord.xy) / _HScaleFactorSSGI; + float2 pixCoordDownscaledSnapped = floor(pixCoordDownscaled + 0.5 / _HScaleFactorSSGI); // or round(pixCoordDownscaled) ? + + float SigmaScale = pow(abs(_HScaleFactorSSGI - 1.0), 0.2); + float Sigma = lerp(0.3, 0.65, SigmaScale); + float AccumulatedWeight = 0; + + for (int i = 0; i < 9; i++) + { + float2 SampleCoord = pixCoordDownscaledSnapped + SampleOffsets[i]; + int2 SampleCoordSnapped = clamp(SampleCoord, 0 , _ScreenSize.xy / _HScaleFactorSSGI - 1); + + float Unused; + float4 Sample = InterpolationSample(CenterData, SampleCoordSnapped, Unused); + Sample.xyz = SpatialDenoisingTonemap(Sample.xyz); + + float2 Delta = (pixCoordDownscaled - SampleCoord); + float DistanceSq = dot(Delta, Delta); + float Weight = exp(-DistanceSq / (2.0 * Sigma * Sigma)); + + Sample.w *= Weight; + InterpolatedRadiance += Sample.xyz * Sample.w; + AccumulatedWeight += Sample.w; + } + + InterpolatedRadiance = AccumulatedWeight > 0 ? SpatialDenoisingTonemapInverse((InterpolatedRadiance) / AccumulatedWeight) : RadianceCenter; + } + + _Radiance_Output[H_COORD(pixCoord.xy)] = InterpolatedRadiance; + _NormalDepth_HistoryOutput[H_COORD(pixCoord.xy)] = PackNormalDepth(NormalCenterWS, DepthCenter); +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute.meta new file mode 100644 index 0000000..0449987 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: d9e32df3caf2788448cd612608bce346 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HInterpolationSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute new file mode 100644 index 0000000..99dc7f0 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute @@ -0,0 +1,231 @@ +#pragma kernel TraceSSGI +#pragma kernel MaskExclude + +#pragma multi_compile _ PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 +#pragma multi_compile _ FALLBACK_SKY FALLBACK_APV +#pragma multi_compile _ CHECKERBOARDING + +// Tracing keywords +#pragma multi_compile _ REFINE_INTERSECTION +#pragma multi_compile _ HALF_STEP_VALIDATION +#pragma multi_compile _ FULL_RESOLUTION_DEPTH +#pragma multi_compile LINEAR_THICKNESS UNIFORM_THICKNESS + +#define FALLBACK_STAGE 1 + +#include "../Includes/HRayMarchingSSGI.hlsl" +#include "../Includes/HFallbackSSGI.hlsl" +#include "../Headers/HDRP files/RaytracingSampling.hlsl" +#pragma multi_compile _ _GBUFFER_NORMALS_OCT + + +int _IndexXR; +int _RayCount; +float _SkyFallbackIntensity; + +H_TEXTURE(_SampleCount); + +H_RW_TEXTURE(float3, _Radiance_Output); +H_RW_TEXTURE(float, _AmbientOcclusion_Output); + +RWStructuredBuffer _TracingCoords; +RWStructuredBuffer _RayCounter; + + +// ------------------------ SSGI RENDER ------------------------- +[numthreads(8, 8, 1)] +void TraceSSGI(uint3 pixCoord : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex, uint groupID : SV_GroupID) +{ + if (CHECKERBOARDING) + { + uint RayCounterOffsetVR = 0; + uint IndirectCoordOffsetVR = 0; + + + uint RayIndex = groupID * 64 + groupIndex; + if (RayIndex >= _RayCounter[1 + RayCounterOffsetVR]) + return; + + pixCoord.xy = _TracingCoords[RayIndex + IndirectCoordOffsetVR]; + } + else + { + } + + uint2 pixCoordUnscaled = GetUnscaledCoords(pixCoord.xy); + float2 pixCoordNDC = (float2(pixCoordUnscaled) + 0.5f) * _ScreenSize.zw; + + float DepthCenter = HBUFFER_DEPTH(pixCoordUnscaled); + float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoordUnscaled); + float3 PositionCenterWS = H_COMPUTE_POSITION_WS(pixCoordNDC, DepthCenter, H_MATRIX_I_VP); + + float3 ViewDir = normalize(_WorldSpaceCameraPos - H_GET_ABSOLUTE_POSITION_WS(PositionCenterWS) ); + + if (DepthCenter <= UNITY_RAW_FAR_CLIP_VALUE) + { + _Reservoir_Output[H_COORD(pixCoord.xy)] = 0; + _AmbientOcclusion_Output[H_COORD(pixCoord.xy)] = 0; + return; + } + + float3 Diffuse = GetReservoirDiffuse(pixCoordUnscaled); + uint ReservoirUpdateRandom = Hash3(uint3(pixCoord.xy, _FrameCount)); + TemporalReservoir RadianceRes = (TemporalReservoir)0; + OcclusionReservoir OcclusionRes = (OcclusionReservoir)0; + + const float StepJitter = Jitter((pixCoord.xy) * 2 - 1); + int FrameStep = 1; if (CHECKERBOARDING) { FrameStep = 2;} + + float AmbientOcclusion = 0, AmbientOcclusionInvalidity = 0; + float3 DirectionsAccumulated = 0, BentNormal = 0, Radiance = 0; + + // Tracing + for (int i = 0; i < _RayCount; i++) + { + int SampleIndex = ((floor(uint(_FrameCount) / FrameStep) % 16) * _RayCount + i); + + float2 SampleRandom; + SampleRandom.x = GetBNDSequenceSample(pixCoord.xy, SampleIndex, 0); + SampleRandom.y = GetBNDSequenceSample(pixCoord.xy, SampleIndex, 1); + float3 RayDirectionWS = HSampleHemisphereCosine(SampleRandom.x, SampleRandom.y, NormalCenterWS); + + DirectionsAccumulated += RayDirectionWS; + + float3 RayOriginBiasedWS, RayStartPositionNDC, RayEndPositionNDC; + GetRayOriginAndDirectionNDC(_RayLength, DepthCenter, pixCoordNDC, PositionCenterWS, RayDirectionWS, NormalCenterWS, RayOriginBiasedWS, RayStartPositionNDC, RayEndPositionNDC); + + float4 HitData = RayMarch(RayStartPositionNDC, RayEndPositionNDC, StepJitter); + + float3 HitRadiance = 0; + float OcclusionDistance = 0, HitOcclusion = 0, HitDistance = 0; + + if (HitData.w) + { + bool MovingHitPoint; + HitRadiance = UnpackColorHit(asuint(H_LOAD(_Color, HitData.xy * _ScreenSize.xy).x), MovingHitPoint); + + float3 HitPosition = H_COMPUTE_POSITION_WS(HitData.xy, HitData.z, H_MATRIX_I_VP); + HitDistance = distance(PositionCenterWS, HitPosition); + //RayDirectionWS = normalize(HitPosition - PositionCenterWS); + + float HitSurface = H_LOAD(g_HTraceDepthPyramidSSGI, HitData.xy * _ScreenSize.xy).x; + float HitSurfaceLinear = H_LINEAR_EYE_DEPTH(HitSurface); + float HitDepthLinear = H_LINEAR_EYE_DEPTH(HitData.z); + + // Don't run hit validation on skybox hits + if (HitSurface > UNITY_RAW_FAR_CLIP_VALUE) + { + if (abs(HitDepthLinear - HitSurfaceLinear) > HitDistance + 0.05f * max(HitSurfaceLinear, 0.25f)) + HitRadiance = 0; + + if (dot(HBUFFER_NORMAL_WS(HitData.xy * _ScreenSize.xy), RayDirectionWS) > _BackfaceLighting) + HitRadiance = 0; + } + + HitRadiance *= ExponentialFalloff(HitDistance, _RayLength); + + if (HitDistance < 0.5) + AmbientOcclusion++; + + float HitSamplecount = H_LOAD(_SampleCount, HitData.xy * _ScreenSize.xy / _HScaleFactorSSGI).x; + if (HitSamplecount < 2) + AmbientOcclusionInvalidity++; + + if (HitDistance < 1.0) + { + OcclusionDistance = HitDistance; + HitOcclusion = MovingHitPoint ? 1 : 0; + } + } + + Radiance += HitRadiance; + BentNormal += RayDirectionWS * (1 - HitData.w); + + ReservoirUpdate(HitRadiance, RayDirectionWS, NormalCenterWS, HitDistance, HitData.w, Luminance(HitRadiance * Diffuse), 1, RadianceRes, ReservoirUpdateRandom); + ReservoirUpdate(HitOcclusion, RayDirectionWS, OcclusionDistance, HitOcclusion, 1, OcclusionRes, ReservoirUpdateRandom); + } + + // Fallback + if (FALLBACK_APV || FALLBACK_SKY) + { + float3 FallbackRadiance = 0; + + if (length(DirectionsAccumulated) > 0) + BentNormal /= length(DirectionsAccumulated); + + float BentNormalOcclusion = length(BentNormal); + BentNormal = BentNormalOcclusion > 0 ? BentNormal / BentNormalOcclusion : NormalCenterWS; + + // APV Fallback + #ifdef FALLBACK_APV + if (_EnableProbeVolumes) + { + if (PROBE_VOLUMES_L1 || PROBE_VOLUMES_L2) + { + float3 BakedAPV = EvaluateFallbackAPV(_APVParams, PositionCenterWS, BentNormal, H_GET_VIEW_DIRECTION_WS(PositionCenterWS), pixCoord.xy); + FallbackRadiance = BakedAPV * RadianceRes.M * BentNormalOcclusion; + } + } + #endif + + // Sky Fallback + if (FALLBACK_SKY) + { + float3 Sky = EvaluateFallbackSky(BentNormal); + FallbackRadiance = Sky * RadianceRes.M * BentNormalOcclusion * _SkyFallbackIntensity; + } + + FallbackRadiance = max(FallbackRadiance, 0); + ReservoirUpdate(FallbackRadiance, NormalCenterWS, false, Luminance(FallbackRadiance * Diffuse), 1 / float(_RayCount), RadianceRes, ReservoirUpdateRandom); + } + + RadianceRes.W = RadianceRes.Wsum / max(RadianceRes.M * Luminance(RadianceRes.Color * Diffuse), 1e-7); + OcclusionRes.W = OcclusionRes.Wsum / max(OcclusionRes.M * OcclusionRes.Occlusion, 1e-7); + RadianceRes.OriginNormal = NormalCenterWS; + + if (RadianceRes.HitFound == false) // && OcclusionRes.Distance > 0 && OcclusionRes.Occlusion > 0) + { + RadianceRes.Direction = OcclusionRes.Direction; + RadianceRes.Distance = OcclusionRes.Distance; + } + + float InvalidityEncodingSign = AmbientOcclusionInvalidity > 0 ? -1 : 1; + _AmbientOcclusion_Output[H_COORD(pixCoord.xy)] = (1 - (AmbientOcclusion / float(_RayCount))) * InvalidityEncodingSign; + _Reservoir_Output[H_COORD(pixCoord.xy)] = PackTemporalReservoir(RadianceRes); + + bool MovingHitPoint; + float3 HitRadiance = UnpackColorHit(asuint(H_LOAD(_Color, pixCoord.xy).x), MovingHitPoint); + + //_Radiance_Output[H_COORD(pixCoord.xy)] =RadianceRes.Color * RadianceRes.W; +} + + +// ------------------------ MASK EXCLUDE [HDRP ONLY] ----------------------- +[numthreads(8, 8, 1)] +void MaskExclude(uint3 pixCoord : SV_DispatchThreadID) +{ + + if (HBUFFER_RENDER_LAYER_MASK(pixCoord.xy) & _ExcludeReceivingLayerMaskSSGI) + { + float3 Radiance = 0; + + #ifdef FALLBACK_APV + if (_EnableProbeVolumes) + { + if (PROBE_VOLUMES_L1 || PROBE_VOLUMES_L2) + { + float DepthCenter = HBUFFER_DEPTH(pixCoord.xy); + float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoord.xy); + float3 PositionCenterWS = H_COMPUTE_POSITION_WS((pixCoord.xy + 0.5f) * _ScreenSize.zw, DepthCenter, H_MATRIX_I_VP); + + Radiance = EvaluateFallbackAPV(_APVParams, PositionCenterWS, NormalCenterWS, H_GET_VIEW_DIRECTION_WS(PositionCenterWS), pixCoord.xy); + } + } + #elif FALLBACK_SKY + float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoord.xy); + Radiance = EvaluateFallbackSky(NormalCenterWS); + #endif + + _Radiance_Output[H_COORD(pixCoord.xy)] = Radiance; + } +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute.meta new file mode 100644 index 0000000..5935199 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: a19906341f84b914a88dd6966db40d78 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HRenderSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute new file mode 100644 index 0000000..1814de8 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute @@ -0,0 +1,498 @@ +#pragma kernel TemporalResampling +#pragma kernel FireflySuppression +#pragma kernel SpatialResampling SpatialResamplingValidation = SpatialResampling +#pragma kernel SpatialValidation SpatialResamplingValidation = SpatialValidation VALIDATION_STAGE + +#include "../Includes/HRayMarchingSSGI.hlsl" +#include "../Headers/HSpaceTransforms.hlsl" +#include "../Headers/HDRP files/RaytracingSampling.hlsl" + +#pragma multi_compile _ _GBUFFER_NORMALS_OCT + +#pragma multi_compile _ CHECKERBOARDING +#pragma multi_compile _ VALIDATE_SPATIAL_OCCLUSION +#pragma multi_compile _ VALIDATE_TEMPORAL_LIGHTING +#pragma multi_compile _ VALIDATE_TEMPORAL_OCCLUSION + +// Tracing keywords +#pragma multi_compile _ REFINE_INTERSECTION +#pragma multi_compile _ HALF_STEP_VALIDATION +#pragma multi_compile _ FULL_RESOLUTION_DEPTH +#pragma multi_compile LINEAR_THICKNESS UNIFORM_THICKNESS + +#ifdef VALIDATION_STAGE +#define SECOND_SPATIAL_PASS 1 +#else +#define SECOND_SPATIAL_PASS 0 +#endif + +#ifdef CHECKERBOARDING +#define RESTIR_HISTORY_MAX_LENGTH 32 +#define RESTIR_HISTORY_MIN_LENGTH 1 +#else +#define RESTIR_HISTORY_MAX_LENGTH 32 +#define RESTIR_HISTORY_MIN_LENGTH 0 +#endif + +H_TEXTURE(_SpatialGuidance); +H_TEXTURE(_SampleCount); +H_TEXTURE (_AmbientOcclusion); +H_TEXTURE(_AmbientOcclusionReprojected); +H_TEXTURE(_SpatialOcclusion); +H_TEXTURE(_TemporalInvalidity); + +H_RW_TEXTURE(float3, _Radiance_Output); +H_RW_TEXTURE(float2, _TemporalInvalidity_Output); +H_RW_TEXTURE(float, _AmbientOcclusion_Output); +H_RW_TEXTURE(float, _SpatialOcclusion_Output); +H_RW_TEXTURE(uint2, _SpatialGuidance_Output); +H_RW_TEXTURE(uint, _NormalDepth_HistoryOutput); + +StructuredBuffer _PointDistribution; + +float _FilterRadius; +float _FilterAdaptivity; +int _DenoiseFallback; +int _RayCount; + + +// ------------------------ TEMPORAL RESAMPLING + VALIDATION ------------------------- +[numthreads(8, 8, 1)] +void TemporalResampling(uint3 pixCoord : SV_DispatchThreadID) +{ + + uint2 pixCoordUnscaled = GetUnscaledCoords(pixCoord.xy); + float DepthCenter = HBUFFER_DEPTH(pixCoordUnscaled); + + if (DepthCenter <= UNITY_RAW_FAR_CLIP_VALUE) + { + _ReservoirLuminance_Output[H_COORD(pixCoord.xy)] = -1; + _NormalDepth_HistoryOutput[H_COORD(pixCoord.xy)] = 0; + _ReservoirSpatial_Output[H_COORD(pixCoord.xy)] = 0; + _ReservoirTemporal_Output[H_COORD(pixCoord.xy)] = 0; + _AmbientOcclusion_Output[H_COORD(pixCoord.xy)] = 0; + _TemporalInvalidity_Output[H_COORD(pixCoord.xy)] = 0; + return; + } + + float3 Diffuse = GetReservoirDiffuse(pixCoordUnscaled); + uint ReservoirUpdateRandom = Hash3(uint3(pixCoord.xy, _FrameCount)); + + // Load and unpack current and reprojected reservoirs + TemporalReservoir TemporalRes = (TemporalReservoir)0; + TemporalReservoir TemporalReprojectedRes = (TemporalReservoir)0; + UnpackTemporalReservoir(asuint(H_LOAD(_Reservoir, pixCoord.xy)), Diffuse, TemporalRes); + UnpackTemporalReservoir(asuint(H_LOAD(_ReservoirReprojected, pixCoord.xy)), Diffuse, TemporalReprojectedRes); + + float MaxHistoryClamp = RESTIR_HISTORY_MAX_LENGTH * max((uint(_RayCount) / 4), 1); + MaxHistoryClamp = clamp(MaxHistoryClamp, 0, 100); + + // Backup current Color and W for replacement + float4 OriginalColorW = float4(TemporalRes.Color, TemporalRes.W); + float SamplecountReprojected = H_LOAD(_SampleCount, pixCoord.xy).x; + bool CullCheckerboard = true; + + float AmbientOcclusion = H_LOAD(_AmbientOcclusion, pixCoord.xy).x; + float AmbientOcclusionInvalidity = sign(AmbientOcclusion) < 0 ? 0 : 1; + + // Checkerboarding logic + if (ENABLE_TEMPORAL_RESTIR) + { + if (CHECKERBOARDING) + { + CullCheckerboard = false; + if (((pixCoord.x + pixCoord.y) % 2 == 0 && uint(_FrameCount) % 2 == 0) || SamplecountReprojected <= 1) CullCheckerboard = true; + if (((pixCoord.x + pixCoord.y) % 2 != 0 && uint(_FrameCount) % 2 != 0) || SamplecountReprojected <= 1) CullCheckerboard = true; + + if (CullCheckerboard == false) + { + TemporalRes.Color = TemporalReprojectedRes.Color; + TemporalRes.Wsum = TemporalReprojectedRes.Wsum; + TemporalRes.W = TemporalReprojectedRes.W; + TemporalRes.M = TemporalReprojectedRes.M; + TemporalRes.OriginNormal = TemporalReprojectedRes.OriginNormal; + TemporalRes.Direction = TemporalReprojectedRes.Direction; + TemporalRes.Distance = TemporalReprojectedRes.Distance; + TemporalRes.HitFound = TemporalReprojectedRes.HitFound; + } + else + { ReservoirUpdate(TemporalReprojectedRes, TemporalRes, ReservoirUpdateRandom); } + } + else + { ReservoirUpdate(TemporalReprojectedRes, TemporalRes, ReservoirUpdateRandom); } + } + + bool HitIsMoving = false; + float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoordUnscaled); + float2 pixCoordNDC = (float2(pixCoordUnscaled) + 0.5f) / _ScreenSize.xy; + float3 PositionCenterWS = H_COMPUTE_POSITION_WS(pixCoordNDC, DepthCenter, H_MATRIX_I_VP); + + bool IsOcclusionValidation = false; + if (!TemporalRes.HitFound && TemporalRes.Distance > 0 && TemporalRes.Distance < 1) + IsOcclusionValidation = true; + + bool ReplaceRadiance = false; + if (VALIDATE_TEMPORAL_OCCLUSION) + { + // If the distance is in [0,1] and a hit wasn't found then we store occlusion data + bool IsOcclusionValidation = false; + if (!TemporalRes.HitFound && TemporalRes.Distance > 0 && TemporalRes.Distance < 1) + IsOcclusionValidation = true; + + float StepJitter = Jitter((pixCoord.xy) * 2 - 1); + float3 RayOriginBiasedWS, RayStartPositionNDC, RayEndPositionNDC; + GetRayOriginAndDirectionNDC(_RayLength, DepthCenter, pixCoordNDC, PositionCenterWS, TemporalRes.Direction, NormalCenterWS, RayOriginBiasedWS, RayStartPositionNDC, RayEndPositionNDC); + float4 HitData = RayMarchValidation(RayStartPositionNDC, RayEndPositionNDC, StepJitter); + + if (HitData.w) + { + float3 HitPosition = H_COMPUTE_POSITION_WS(HitData.xy, HitData.z, H_MATRIX_I_VP); + float HitDistance = distance(PositionCenterWS, HitPosition); + HitIsMoving = HBUFFER_MOTION_MASK(HitData.xy * _ScreenSize.xy); + + // We did hit something, but it was the wrong spot + if (abs(HitDistance - TemporalRes.Distance) / (TemporalRes.Distance + TemporalRes.Distance) > 0.2f) + { + // Clamp history (smoother reaction) + if (TemporalRes.HitFound && HitDistance < TemporalRes.Distance ) // && HitDistance > 0 && TemporalRes.Distance > 0) + MaxHistoryClamp = 0; + + // Replace radiance (faster reaction) if it was occlusion validation + if (IsOcclusionValidation && HitDistance < 1) // && dot(normalize(PositionCenterWS - HitPosition), TemporalRes.Direction) < 0) + ReplaceRadiance = true; + } + } + else if (IsOcclusionValidation) + { + // If we didn't hit anything but should have (because it was occlusion validation). + ReplaceRadiance = true; + } + } + + bool SampleIsOffscreen = false; + if (VALIDATE_TEMPORAL_LIGHTING && TemporalRes.HitFound) + { + float LightingInvalidity = 1.0f; + for (int x = -1; x <= 1; x++) + { + for (int y = -1; y <= 1; y++) + { + bool MovingHitPoint; + float2 HitCoordNDC = H_COMPUTE_NDC_Z(PositionCenterWS + TemporalRes.Direction * TemporalRes.Distance, H_MATRIX_VP).xy; + float3 HitRadiance = UnpackColorHit(asuint(H_LOAD(_Color, floor(HitCoordNDC * _ScreenSize.xy) + int2(x,y)).x), MovingHitPoint); + + HitRadiance *= ExponentialFalloff(TemporalRes.Distance, _RayLength); + + if (any(HitCoordNDC < 0) || any(HitCoordNDC > 1)) + SampleIsOffscreen = true; + + float3 LuminanceCurrent = (HitRadiance); + float3 LuminanceHistory = (TemporalRes.Color); + + float LightingDifference = length(abs(LuminanceHistory - LuminanceCurrent) / max(1e-3, LuminanceHistory + LuminanceCurrent)); + LightingInvalidity = min(LightingInvalidity, LightingDifference); + } + } + + if (!SampleIsOffscreen) + MaxHistoryClamp *= (1.0f - LightingInvalidity); + } + + if (ENABLE_EXPOSURE_CONTROL) + { + float ExposurePrevious = HGetPreviousExposureMultiplier; + float ExposureCurrent = HGetCurrentExposureMultiplier; + + float ExposureRatio = (ExposurePrevious * ExposureCurrent) != 0.0 ? ExposureCurrent / ExposurePrevious : 100.0; + + if (max(ExposureRatio, 1.0 / ExposureRatio) > 2.0) + MaxHistoryClamp = MaxHistoryClamp * HGetInversePreviousExposureMultiplier * ExposureCurrent; + } + + TemporalRes.W = TemporalRes.Wsum / max(TemporalRes.M * Luminance(TemporalRes.Color * Diffuse), 1e-8); + TemporalRes.M = clamp(TemporalRes.M, RESTIR_HISTORY_MIN_LENGTH, max(RESTIR_HISTORY_MIN_LENGTH, MaxHistoryClamp)); + + if (ReplaceRadiance || SampleIsOffscreen || (AmbientOcclusionInvalidity == 0 && !TemporalRes.HitFound)) + { + MaxHistoryClamp = 0; + if (CullCheckerboard == true) + { + // Tried setting W and Color to 0, looks similar in certain cases, but worse in others + TemporalRes.W = OriginalColorW.w; + TemporalRes.Color = OriginalColorW.xyz; + } + } + + float Samplecount = min(8, SamplecountReprojected + 1); + float TemporalWeight = 1.0f - (1.0f / float(Samplecount)); + + float2 TemporalInvalidity = float2(1,1); + if (VALIDATE_TEMPORAL_OCCLUSION || VALIDATE_TEMPORAL_LIGHTING) + { + TemporalInvalidity.x = MaxHistoryClamp / RESTIR_HISTORY_MAX_LENGTH; + TemporalInvalidity.y = MaxHistoryClamp < (RESTIR_HISTORY_MAX_LENGTH && HitIsMoving) ? 0 : 1; + + if (TemporalRes.HitFound == false) + { TemporalInvalidity.x *= AmbientOcclusionInvalidity; } + + float2 TemporalInvalidityReprojected = H_LOAD(_TemporalInvalidity, pixCoord.xy).xy; + TemporalInvalidity = lerp(TemporalInvalidity, TemporalInvalidityReprojected, CullCheckerboard ? TemporalWeight : 1); + + _TemporalInvalidity_Output[H_COORD(pixCoord.xy)] = TemporalInvalidity; + } + + float AmbientOcclusionReprojected = H_LOAD(_AmbientOcclusionReprojected, pixCoord.xy).x; + AmbientOcclusion = lerp(abs(AmbientOcclusion), AmbientOcclusionReprojected, CullCheckerboard ? TemporalWeight * pow(TemporalInvalidity.y, 2) * AmbientOcclusionInvalidity : 1); + + // Transfer data from temporal to spatial reservoir + SpatialReservoir SpatialRes; + SpatialRes.Color = TemporalRes.Color; + SpatialRes.W = TemporalRes.W; + SpatialRes.M = TemporalRes.M; + SpatialRes.HitFound = TemporalRes.HitFound; + SpatialRes.Occlusion = H_LOAD(_SpatialOcclusion, pixCoord.xy).x; + SpatialRes.Direction = TemporalRes.Direction; + SpatialRes.Distance = TemporalRes.Distance; + SpatialRes.Normal = NormalCenterWS; + SpatialRes.Depth = DepthCenter; + + _ReservoirSpatial_Output[H_COORD(pixCoord.xy)] = PackSpatialReservoir(SpatialRes); + _ReservoirTemporal_Output[H_COORD(pixCoord.xy)] = PackTemporalReservoir(TemporalRes); + _ReservoirLuminance_Output[H_COORD(pixCoord.xy)] = Luminance(TemporalRes.Color * TemporalRes.W); + + _AmbientOcclusion_Output[H_COORD(pixCoord.xy)] = AmbientOcclusion; + _NormalDepth_HistoryOutput[H_COORD(pixCoord.xy)] = PackNormalDepth(NormalCenterWS, DepthCenter); + + // _Radiance_Output[H_COORD(pixCoord.xy)] = TemporalRes.Color * TemporalRes.W; + // if (Luminance(TemporalRes.Color * TemporalRes.W) > 0.01) + // _Radiance_Output[H_COORD(pixCoord.xy)] = lerp(float3(1,0,0), TemporalRes.Color * TemporalRes.W, saturate(MaxHistoryClamp / RESTIR_HISTORY_MAX_LENGTH)); +} + + +// ------------------------ FIREFLY SUPPRESSION ------------------------- +[numthreads(8, 8, 1)] +void FireflySuppression(uint3 pixCoord : SV_DispatchThreadID) +{ + + float LumaCenter = H_LOAD(_ReservoirLuminance, pixCoord.xy).x; + + float2 Moments; + Moments.x = 0; + Moments.y = 0; + + float TotalWeight = 0; + + UNITY_UNROLL + for (int x = -3; x <= 3; x++) + { + UNITY_UNROLL + for (int y = -3; y <= 3; y++) + { + int2 SampleCoord = pixCoord.xy + int2(x, y); + SampleCoord = clamp(SampleCoord, 0, _ScreenSize.xy / _HScaleFactorSSGI - 1); + + float LumaSample = H_LOAD(_ReservoirLuminance, pixCoord.xy + int2(x, y)).x; + + // Sky pixels are marked as -1 + if (LumaSample < 0) + continue; + + Moments.x += LumaSample; + Moments.y += LumaSample * LumaSample; + + TotalWeight += 1; + } + } + + Moments.x /= TotalWeight; + Moments.y /= TotalWeight; + + float Variance = (max(0.0, Moments.y - Moments.x * Moments.x)); + float StdDev = sqrt(Variance); + + float SamplecountReprojected = H_LOAD(_SampleCount, pixCoord.xy).x; + + // Avoid applying firefly suppression for the first 4 frames of temporal accumulation + float SamplecountScale = clamp(4 - SamplecountReprojected, 1, 2); + float LumaThreshold = Moments.x + SamplecountScale * StdDev; + + // If Luma is above threshold - unpack the reservoir, clamp W and pack it back + if (LumaCenter > LumaThreshold) + { + uint4 ReservoirMW = _ReservoirSpatial_Output[H_COORD(pixCoord.xy)]; + + float W = f16tof32(ReservoirMW.y >> 16); + W *= (LumaThreshold / max(LumaCenter, 1e-5)); + + uint PackedW = f32tof16(W); + PackedW = PackedW << 16; + + ReservoirMW.y &= 0x0000FFFF; + ReservoirMW.y |= PackedW; + _ReservoirSpatial_Output[H_COORD(pixCoord.xy)] = ReservoirMW; + } +} + + + +// ------------------------ SPATIAL RESAMPLING + VALIDATION ------------------------- +[numthreads(8, 8, 1)] +void SpatialResamplingValidation(uint3 pixCoord : SV_DispatchThreadID) +{ + + uint2 pixCoordUnscaled = GetUnscaledCoords(pixCoord.xy); + int2 pixCoordMax = _ScreenSize.xy / _HScaleFactorSSGI.xx - 1; + float2 pixCoordNDC = (float2(pixCoordUnscaled) + 0.5f) * _ScreenSize.zw; + + float3 Diffuse = GetReservoirDiffuse(pixCoordUnscaled); + uint ReservoirUpdateRandom = Hash3(uint3(pixCoord.xy, _FrameCount)); + SpatialReservoir Reservoir = (SpatialReservoir)0; + UnpackSpatialReservoir(asuint(H_LOAD(_Reservoir, pixCoord.xy)), Diffuse, Reservoir); + + if (Reservoir.Depth <= UNITY_RAW_FAR_CLIP_VALUE) { return; } + + float DepthCetnerLinear = H_LINEAR_EYE_DEPTH(Reservoir.Depth); + float3 NormalCenterVS = H_TRANSFORM_WORLD_TO_VIEW_NORMAL(Reservoir.Normal); + float3 PositionCenterWS = H_COMPUTE_POSITION_WS(pixCoordNDC, Reservoir.Depth, H_MATRIX_I_VP); + float3 PositionCenterVS = ComputeFastViewSpacePosition(pixCoordNDC, Reservoir.Depth, DepthCetnerLinear); + float4 NormalPlaneVS = float4(NormalCenterVS.xyz, dot(PositionCenterVS, NormalCenterVS.xyz)); + + float SamplecountReprojected = H_LOAD(_SampleCount, pixCoord.xy).x; + float AmbientOcclusion = H_LOAD(_AmbientOcclusion, pixCoord.xy).x; + + #if SECOND_SPATIAL_PASS + uint2 SpatialGuidancePacked = asuint(H_LOAD(_SpatialGuidance, pixCoord.xy).xy); + float AmbientOcclusionFilterScale = UnpackAmbientOcclusion(SpatialGuidancePacked.y); + uint SpatialGuidance = SpatialGuidancePacked.x; + float FilterRadius = _FilterRadius; + uint BufferOffset = 0; + #else + float AmbientOcclusionFilterScale = H_LOAD(_AmbientOcclusion, pixCoord.xy).x; + + if (Luminance(Reservoir.Color * Reservoir.W) < 0.001) + AmbientOcclusionFilterScale = AmbientOcclusionFilterScale > 0.4 ? 1 : AmbientOcclusionFilterScale; + + float FilterRadius = _FilterRadius / 2.0f; + uint SpatialGuidance = 0; + uint BufferOffset = 8; + #endif + + float AdaptiveFilterScale; + if (_DenoiseFallback) AdaptiveFilterScale = min(saturate(Reservoir.Distance / 2 + !Reservoir.HitFound), AmbientOcclusionFilterScale); + else AdaptiveFilterScale = min(saturate(Reservoir.Distance / 2), AmbientOcclusionFilterScale); + + float MinFilterRadius = lerp(0.01f, 0.1f, AmbientOcclusion); + float AdaptivePlaneWeight = lerp(500.0f, 100.0f, AdaptiveFilterScale); + + FilterRadius = max(MinFilterRadius, lerp(FilterRadius, FilterRadius * AdaptiveFilterScale, _FilterAdaptivity)); + + float3x3 OrthoBasis = HGetLocalFrame(Reservoir.Normal); + float DistanceToPoint = length(H_GET_ABSOLUTE_POSITION_WS(PositionCenterWS) - H_GET_CAMERA_POSITION_WS()); + float RadiusScale = lerp(5.0f, 50.0f, saturate(DistanceToPoint / 500.0f)); + float Radius = DistanceToPoint * FilterRadius / RadiusScale; + float Sigma = 0.9f * Radius; + + float WeightTotal = 1; + float2 TemporalInvalidity = 1, TemporalInvalidityAccumulated = 1; + + if (VALIDATE_TEMPORAL_OCCLUSION || VALIDATE_TEMPORAL_LIGHTING) + { TemporalInvalidity = H_LOAD(_TemporalInvalidity, pixCoord.xy).xy; TemporalInvalidityAccumulated = TemporalInvalidity; } + + UNITY_UNROLL + for (int i = 0; i < 8; i++) + { + float GuidanceAdaptivity = 1 - (0.75 * ((SpatialGuidance >> i) & 0x1)); + float2 Point = _PointDistribution[i + BufferOffset].xy * Radius * GuidanceAdaptivity; + + float3 PositionPointWS = PositionCenterWS + OrthoBasis[0] * Point.x + OrthoBasis[1] * Point.y; + float2 SampleCoordNDC = H_COMPUTE_NDC_Z(PositionPointWS, H_MATRIX_VP).xy; + int2 SampleCoord = SampleCoordNDC * _ScreenSize.xy / _HScaleFactorSSGI; + + int2 Overshoot = max(SampleCoord - pixCoordMax, 0); + SampleCoord = SampleCoord - 2 * Overshoot; + + SpatialReservoir SampleReservoir = (SpatialReservoir)0; + uint4 SampleReservoirPacked = asuint(H_LOAD(_Reservoir, SampleCoord)); + UnpackSpatialReservoir(SampleReservoirPacked, Diffuse, SampleReservoir); + + float3 PositionSampleVS = ComputeFastViewSpacePosition(SampleCoordNDC, SampleReservoir.Depth, H_LINEAR_EYE_DEPTH(SampleReservoir.Depth)); + float PlaneWeight = ProbePlaneWeighting(NormalPlaneVS, PositionSampleVS, DepthCetnerLinear, AdaptivePlaneWeight); + float NormalWeight = saturate(dot(Reservoir.Normal, SampleReservoir.Normal)); + float GaussianWeight = GaussianWeighting(length(Point), Sigma); + float OcclusionWeight = 1.0f; + + if (VALIDATE_SPATIAL_OCCLUSION) + { OcclusionWeight = exp2(-10 * abs(Reservoir.Occlusion - SampleReservoir.Occlusion)); } + + float SampleWeight = PlaneWeight * NormalWeight * OcclusionWeight; + SpatialGuidance |= (uint(round(1 - SampleWeight)) << i); + + SampleWeight *= GaussianWeight * ENABLE_SPATIAL_RESTIR; + + SampleReservoir.Wsum *= SampleWeight; + SampleReservoir.M *= SampleWeight; + ReservoirUpdate(SampleReservoir, Reservoir, ReservoirUpdateRandom); + + WeightTotal += NormalWeight * PlaneWeight * GaussianWeight; + + if (VALIDATE_TEMPORAL_OCCLUSION || VALIDATE_TEMPORAL_LIGHTING) + { TemporalInvalidityAccumulated += H_LOAD(_TemporalInvalidity, SampleCoord).xy * NormalWeight * PlaneWeight * GaussianWeight; } + } + + Reservoir.W = Reservoir.Wsum / max(Reservoir.M * Luminance(Reservoir.Color * Diffuse), 1e-8); + float3 FinalColor = Reservoir.Color * Reservoir.W; + + if (SECOND_SPATIAL_PASS) + { + if (VALIDATE_SPATIAL_OCCLUSION) // && Reservoir.HitFound) + { + float SpatialOcclusion = 1; + const float3 RayDirectionWS = Reservoir.Direction; + float StepJitter = Jitter((pixCoord.xy) * 2 - 1); + + float3 RayOriginBiasedWS, RayStartPositionNDC, RayEndPositionNDC; + GetRayOriginAndDirectionNDC(min(3, Reservoir.Distance), Reservoir.Depth, pixCoordNDC, PositionCenterWS, RayDirectionWS, Reservoir.Normal, RayOriginBiasedWS, RayStartPositionNDC, RayEndPositionNDC); + + float4 HitData = RayMarchValidation(RayStartPositionNDC, RayEndPositionNDC, StepJitter); + + if (HitData.w) + { + float3 HitPosition = H_COMPUTE_POSITION_WS(HitData.xy, HitData.z, H_MATRIX_I_VP); + float HitDistance = distance(PositionCenterWS, HitPosition); + + if (abs(HitDistance - Reservoir.Distance) / (Reservoir.Distance + Reservoir.Distance) > 0.2) + { + if (HitDistance < Reservoir.Distance) + { + SpatialOcclusion = saturate(HitDistance / 3.0f); + + if (Reservoir.HitFound) + { + if (dot(HBUFFER_NORMAL_WS(HitData.xy * _ScreenSize.xy), RayDirectionWS) > _BackfaceLighting) + { + FinalColor *= saturate(HitDistance / 1.0f); + } + } + } + } + } + + float Samplecount = min(16, SamplecountReprojected + 1); + float TemporalWeight = 1.0f - (1.0f / float(Samplecount)); + + float SpatialOcclusionReprojected = H_LOAD(_SpatialOcclusion, pixCoord.xy).x; + SpatialOcclusion = lerp(SpatialOcclusion, SpatialOcclusionReprojected, TemporalWeight * pow(TemporalInvalidity.y, 2)); + _SpatialOcclusion_Output[H_COORD(pixCoord.xy)] = SpatialOcclusion; + } + + _Radiance_Output[H_COORD(pixCoord.xy)] = FinalColor; + } + else + { + _SpatialGuidance_Output[H_COORD(pixCoord.xy)] = uint2(SpatialGuidance, PackAmbientOcclusion(AdaptiveFilterScale)); + _Reservoir_Output[H_COORD(pixCoord.xy)] = PackSpatialReservoir(Reservoir); + } + + if (VALIDATE_TEMPORAL_OCCLUSION || VALIDATE_TEMPORAL_LIGHTING) + { _TemporalInvalidity_Output[H_COORD(pixCoord.xy)] = TemporalInvalidityAccumulated / WeightTotal; } +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute.meta new file mode 100644 index 0000000..1e565a6 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 97f6e36d045d93d4ea8ed934f8bc4a03 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HRestirSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute new file mode 100644 index 0000000..4b30d9a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute @@ -0,0 +1,438 @@ +#pragma kernel TemporalReprojection +#pragma kernel ColorReprojection +#pragma kernel CopyHistory +#pragma kernel LuminanceMomentsGeneration +#pragma kernel LuminanceMomentsClear + +#include "../Includes/HReservoirSSGI.hlsl" +#include "../Includes/HFallbackSSGI.hlsl" +#pragma multi_compile _ _GBUFFER_NORMALS_OCT + +#pragma multi_compile _ REPROJECT_COLOR +#pragma multi_compile _ AUTOMATIC_BRIGHTNESS_CLAMP +#pragma multi_compile _ REPROJECT_TEMPORAL_INVALIDITY +#pragma multi_compile _ REPROJECT_SPATIAL_OCCLUSION +#pragma multi_compile _ FULL_RESOLUTION_REPROJECTION + +H_TEXTURE(_HTraceBufferGI); +H_TEXTURE(_Color_History); +H_TEXTURE(_NormalDepth_History); +H_TEXTURE(_Radiance_History); +H_TEXTURE(_Samplecount_History); +H_TEXTURE(_SpatialOcclusion_History); +H_TEXTURE(_TemporalInvalidity_History); +H_TEXTURE(_AmbientOcclusion_History); + +H_RW_TEXTURE(float, _AmbientOcclusion_Output); +H_RW_TEXTURE(float2, _TemporalInvalidity_Output); +H_RW_TEXTURE(float, _Samplecount_Output); +H_RW_TEXTURE(float, _SpatialOcclusion_Output); +H_RW_TEXTURE(float4, _Radiance_Output); +H_RW_TEXTURE(uint, _ReprojectedColor_Output); + +groupshared uint GroupMoment1; +groupshared uint GroupMoment2; +RWStructuredBuffer _LuminanceMoments; + +float _BrightnessClamp; +float _MaxDeviation; + + +// ------------------------ REPROJECTION STRUCTS ----------------------- +struct CurrentFrameData +{ + float3 Normal; + float3 WorldPos; + float DepthRaw; + float DepthLinear; + float2 RejectionPower; +}; + +struct PreviousFrameData +{ + float3 Normal; + float3 WorldPos; + float DepthLinear; +}; + + +// ------------------------ REPROJECTION STRUCTS ----------------------- +float Disocclusion(CurrentFrameData CurrentData, PreviousFrameData PreviousData) +{ + float Diosocclusion = 1; + + float PlaneDistance = abs(dot(PreviousData.WorldPos - CurrentData.WorldPos, CurrentData.Normal)); + float RelativeDepthDifference = PlaneDistance / CurrentData.DepthLinear; + if (exp2(-CurrentData.RejectionPower.x * (RelativeDepthDifference * RelativeDepthDifference)) < 0.1f) + Diosocclusion = 0.0f; + + if (abs((PreviousData.DepthLinear - CurrentData.DepthLinear) / CurrentData.DepthLinear) >= CurrentData.RejectionPower.y) + Diosocclusion = 0.0f; + + if (dot(PreviousData.Normal, CurrentData.Normal) < 0.5) + Diosocclusion = 0.0f; + + return Diosocclusion; +} + + +// ------------------------ COLOR REPROJECTION ----------------------- +[numthreads(8, 8, 1)] +void ColorReprojection(uint3 pixCoord : SV_DispatchThreadID) +{ + + bool MovingPixel = HBUFFER_MOTION_MASK(pixCoord.xy); + float2 pixCoordNDC = (pixCoord.xy + 0.5f) / _ScreenSize.xy; + + float3 Sky = EvaluateFallbackSky(H_GET_VIEW_VECTOR_WS(pixCoordNDC)); + + float LumaThreshold = _BrightnessClamp; + + if (AUTOMATIC_BRIGHTNESS_CLAMP) + { + uint2 MomentsPacked; + MomentsPacked.x = _LuminanceMoments[0]; + MomentsPacked.y = _LuminanceMoments[1]; + + float2 Moments; + float Scale = 4294967295.0f / (30.0f * 30.0f); + Moments.x = float(MomentsPacked.x) / Scale; + Moments.y = float(MomentsPacked.y) / Scale; + + float Variance = (max(0.0, Moments.y - Moments.x * Moments.x)); + float StdDev = sqrt(Variance); + LumaThreshold = Moments.x + _MaxDeviation * StdDev; + } + + CurrentFrameData CurrentData; + CurrentData.DepthRaw = HBUFFER_DEPTH(pixCoord.xy); + CurrentData.Normal = HBUFFER_NORMAL_WS(pixCoord.xy); + CurrentData.DepthLinear = H_LINEAR_EYE_DEPTH(CurrentData.DepthRaw); + CurrentData.WorldPos = H_COMPUTE_POSITION_WS(pixCoordNDC, CurrentData.DepthRaw, H_MATRIX_I_VP); + + const float DepthAligment = 1.0f - dot(-normalize(H_GET_ABSOLUTE_POSITION_WS((CurrentData.WorldPos)) - _WorldSpaceCameraPos), CurrentData.Normal); + CurrentData.RejectionPower.x = 100000.0f * (MovingPixel ? 0.0001 * CurrentData.DepthLinear * CurrentData.DepthLinear : 1); + CurrentData.RejectionPower.y = lerp(1e-2f, 1e-1f, pow(DepthAligment, 8)) * (MovingPixel ? 50 / CurrentData.DepthLinear : 1); + + if (!REPROJECT_COLOR) + { + float3 ReprojectedColor = CurrentData.DepthRaw <= UNITY_RAW_FAR_CLIP_VALUE ? Sky : HBUFFER_COLOR(pixCoord.xy).xyz; + + float ReprojectedColorLuma = Luminance(ReprojectedColor); + if (ReprojectedColorLuma > LumaThreshold) + ReprojectedColor *= (LumaThreshold / ReprojectedColorLuma); + + _ReprojectedColor_Output[H_COORD(pixCoord.xy)] = PackColorHit(ReprojectedColor, MovingPixel); + //return; + } + + float2 ReprojectionCoord = float2(pixCoord.xy) - HBUFFER_MOTION_VECTOR(pixCoord.xy) * floor(_ScreenSize.xy); + ReprojectionCoord /= (HRenderScale.xy / HRenderScalePrevious.xy); + + float UVx = frac(ReprojectionCoord.x); + float UVy = frac(ReprojectionCoord.y); + + float4 ReprojectionWeights; + ReprojectionWeights.x = (1.0f - UVx) * (1.0f - UVy); + ReprojectionWeights.y = (UVx) * (1.0f - UVy); + ReprojectionWeights.z = (1.0f - UVx) * (UVy); + ReprojectionWeights.w = (UVx) * (UVy); + + const uint2 ReprojectionOffsets[4] = {uint2(0, 0), uint2(1, 0), uint2(0, 1), uint2(1, 1)}; + + UNITY_UNROLL + for (int i = 0; i < 4; i++) + { + int2 SampleCoord = ReprojectionCoord + ReprojectionOffsets[i]; + uint HistoryNormalDepthPacked = asuint(H_LOAD(_NormalDepth_History, SampleCoord).x); + float4 HistoryNormalDepth = UnpackNormalDepth(HistoryNormalDepthPacked); + + SampleCoord /= (HRenderScalePrevious.xy / HRenderScale.xy); + + PreviousFrameData PreviousData; + PreviousData.Normal = HistoryNormalDepth.xyz; + PreviousData.WorldPos = H_COMPUTE_POSITION_WS((SampleCoord + 0.5f) * _ScreenSize.zw, HistoryNormalDepth.w, H_MATRIX_PREV_I_VP); + PreviousData.DepthLinear = H_LINEAR_EYE_DEPTH(PreviousData.WorldPos, UNITY_MATRIX_V); + + ReprojectionWeights[i] *= Disocclusion(CurrentData, PreviousData); + + if (CurrentData.DepthRaw <= UNITY_RAW_FAR_CLIP_VALUE) + ReprojectionWeights[i] = 1; + + if (any(SampleCoord.xy >= _ScreenSize.xy)) + ReprojectionWeights[i] = 0; + } + + float WeightsTotal = ReprojectionWeights.x + ReprojectionWeights.y + ReprojectionWeights.z + ReprojectionWeights.w; + + float ReprojectedSamplecount = 0; + float3 ReprojectedRadiance = 0; + float3 ReprojectedColor = 0; + + if (WeightsTotal > 0.15f) + { + ReprojectionWeights = WeightsTotal > 0 ? ReprojectionWeights / WeightsTotal : 0; + + float BestWeight = 0; + uint2 BestOffset = 0; + + UNITY_UNROLL + for (int i = 0; i < 4; i++) + { + float4 RadianceSamplecountHistory = H_LOAD(_Radiance_History, ReprojectionCoord + ReprojectionOffsets[i]) * ReprojectionWeights[i]; + ReprojectedSamplecount += RadianceSamplecountHistory.w; + ReprojectedRadiance += RadianceSamplecountHistory.xyz; + + // Select best reprojection for color + if (ReprojectionWeights[i] > BestWeight) + { + BestWeight = ReprojectionWeights[i]; + BestOffset = ReprojectionOffsets[i]; + } + } + + if (REPROJECT_COLOR) + { + ReprojectedColor = CurrentData.DepthRaw <= UNITY_RAW_FAR_CLIP_VALUE ? Sky : H_LOAD(_Color_History, ReprojectionCoord + BestOffset).xyz; + + float ReprojectedColorLuma = Luminance(ReprojectedColor); + if (ReprojectedColorLuma > LumaThreshold) + ReprojectedColor *= (LumaThreshold / ReprojectedColorLuma); + } + } + + _Radiance_Output[H_COORD(pixCoord.xy)] = float4(ReprojectedRadiance.xyz, ReprojectedSamplecount.x); + _ReprojectedColor_Output[H_COORD(pixCoord.xy)] = PackColorHit(ReprojectedColor, MovingPixel); +} + + +// ------------------------ TEMPORAL REPROJECTION ----------------------- +[numthreads(8, 8, 1)] +void TemporalReprojection(uint3 pixCoord : SV_DispatchThreadID) +{ + + uint2 pixCoordUnscaled = GetUnscaledCoords(pixCoord.xy); + float2 pixCoordNDC = (float2(pixCoordUnscaled) + 0.5f) / _ScreenSize.xy; + + float3 Sky = EvaluateFallbackSky(H_GET_VIEW_VECTOR_WS(pixCoordNDC)); + + float LumaThreshold = _BrightnessClamp; + + if (AUTOMATIC_BRIGHTNESS_CLAMP) + { + uint2 MomentsPacked; + MomentsPacked.x = _LuminanceMoments[0]; + MomentsPacked.y = _LuminanceMoments[1]; + + float2 Moments; + float Scale = 4294967295.0f / (30.0f * 30.0f); + Moments.x = float(MomentsPacked.x) / Scale; + Moments.y = float(MomentsPacked.y) / Scale; + + float Variance = (max(0.0, Moments.y - Moments.x * Moments.x)); + float StdDev = sqrt(Variance); + LumaThreshold = Moments.x + _MaxDeviation * StdDev; + } + + CurrentFrameData CurrentData; + CurrentData.DepthRaw = HBUFFER_DEPTH(pixCoordUnscaled); + CurrentData.Normal = HBUFFER_NORMAL_WS(pixCoordUnscaled); + CurrentData.DepthLinear = H_LINEAR_EYE_DEPTH(CurrentData.DepthRaw); + CurrentData.WorldPos = H_COMPUTE_POSITION_WS(pixCoordNDC, CurrentData.DepthRaw, H_MATRIX_I_VP); + + bool MovingPixel = HBUFFER_MOTION_MASK(pixCoordUnscaled); + float DepthAligment = 1.0f - dot(-normalize(H_GET_ABSOLUTE_POSITION_WS((CurrentData.WorldPos)) - _WorldSpaceCameraPos), CurrentData.Normal); + CurrentData.RejectionPower.x = 100000.0f * (MovingPixel ? 0.0001 * CurrentData.DepthLinear * CurrentData.DepthLinear : 1); + CurrentData.RejectionPower.y = lerp(1e-2f, 1e-1f, pow(DepthAligment, 8)) * (MovingPixel ? 50 / CurrentData.DepthLinear : 1); + + float2 MotionVectors = HBUFFER_MOTION_VECTOR(pixCoordUnscaled); + float2 ReprojectionCoord = float2(pixCoord.xy) - MotionVectors * floor(_ScreenSize.xy / _HScaleFactorSSGI); + ReprojectionCoord /= (_HPreviousScaleFactorSSGI.xx / _HScaleFactorSSGI.xx); + ReprojectionCoord /= (HRenderScale.xy / HRenderScalePrevious.xy); + + float UVx = frac(ReprojectionCoord.x); + float UVy = frac(ReprojectionCoord.y); + + float4 ReprojectionWeights; + ReprojectionWeights.x = (1.0f - UVx) * (1.0f - UVy); + ReprojectionWeights.y = (UVx) * (1.0f - UVy); + ReprojectionWeights.z = (1.0f - UVx) * (UVy); + ReprojectionWeights.w = (UVx) * (UVy); + + const uint2 ReprojectionOffsets[4] = {uint2(0, 0), uint2(1, 0), uint2(0, 1), uint2(1, 1)}; + + UNITY_UNROLL + for (int i = 0; i < 4; i++) + { + int2 SampleCoord = ReprojectionCoord + ReprojectionOffsets[i]; + + uint HistoryNormalDepthPacked = asuint(H_LOAD(_NormalDepth_History, SampleCoord).x); + float4 HistoryNormalDepth = UnpackNormalDepth(HistoryNormalDepthPacked); + + SampleCoord /= (HRenderScalePrevious.xy / HRenderScale.xy); + + PreviousFrameData PreviousData; + PreviousData.Normal = HistoryNormalDepth.xyz; + PreviousData.WorldPos = H_COMPUTE_POSITION_WS((SampleCoord * _HPreviousScaleFactorSSGI + 0.5f) * _ScreenSize.zw, HistoryNormalDepth.w, H_MATRIX_PREV_I_VP); + PreviousData.DepthLinear = H_LINEAR_EYE_DEPTH(PreviousData.WorldPos, UNITY_MATRIX_V); + + ReprojectionWeights[i] *= Disocclusion(CurrentData, PreviousData); + + if (CurrentData.DepthRaw <= UNITY_RAW_FAR_CLIP_VALUE) + ReprojectionWeights[i] = 1; + + if (any(SampleCoord.xy >= _ScreenSize.xy / _HPreviousScaleFactorSSGI)) + ReprojectionWeights[i] = 0; + } + + float WeightsTotal = ReprojectionWeights.x + ReprojectionWeights.y + ReprojectionWeights.z + ReprojectionWeights.w; + + TemporalReservoir Reservoir = (TemporalReservoir)0; + float3 Diffuse = GetReservoirDiffuse(pixCoordUnscaled); + + float Samplecount = 0; + float ReprojectedAmbientOcclusion = 1; + float ReprojectedSpatialOcclusion = 1; + float2 ReprojectedTemporalInvalidity = 1; + float3 ReprojectedColor = 0; + float3 ReprojectedRadiance = 0; + + if (WeightsTotal > 0.15f) + { + ReprojectionWeights /= WeightsTotal; + + float BestWeight = 0; + uint2 BestOffset = 0; + ReprojectedSpatialOcclusion = 0; + ReprojectedTemporalInvalidity = 0; + ReprojectedAmbientOcclusion = 0; + + uint ReservoirUpdateRandom = Hash3(uint3(pixCoord.xy, _FrameCount)); + + UNITY_UNROLL + for (int i = 0; i < 4; i++) + { + // Reproject Spatial Occlusion + if (REPROJECT_TEMPORAL_INVALIDITY) { ReprojectedTemporalInvalidity += H_LOAD(_TemporalInvalidity_History, ReprojectionCoord + ReprojectionOffsets[i]).xy * ReprojectionWeights[i]; } + if (REPROJECT_SPATIAL_OCCLUSION) { ReprojectedSpatialOcclusion += H_LOAD(_SpatialOcclusion_History, ReprojectionCoord + ReprojectionOffsets[i]).x * ReprojectionWeights[i]; } + ReprojectedAmbientOcclusion += H_LOAD(_AmbientOcclusion_History, ReprojectionCoord + ReprojectionOffsets[i]).x * ReprojectionWeights[i]; + ReprojectedRadiance += H_LOAD(_Radiance_History, ReprojectionCoord + ReprojectionOffsets[i]).xyz * ReprojectionWeights[i]; + Samplecount += H_LOAD(_Samplecount_History, ReprojectionCoord + ReprojectionOffsets[i]).x * ReprojectionWeights[i]; + + // Reproject ReSTIR reservoir + TemporalReservoir HistoryReservoir = (TemporalReservoir)0; + UnpackTemporalReservoir(asuint(H_LOAD(_Reservoir, ReprojectionCoord + ReprojectionOffsets[i])), Diffuse, HistoryReservoir); + + HistoryReservoir.Wsum *= ReprojectionWeights[i]; + HistoryReservoir.M *= ReprojectionWeights[i]; + + ReservoirUpdate(HistoryReservoir, Reservoir, ReservoirUpdateRandom); + + // Select best reprojection for color + if (ReprojectionWeights[i] > BestWeight) + { + BestWeight = ReprojectionWeights[i]; + BestOffset = ReprojectionOffsets[i]; + } + } + + // Reproject Color + if (FULL_RESOLUTION_REPROJECTION && REPROJECT_COLOR) + { + // Use original reprojection coord to avoid reading Color buffer in wrong location (scaled by _HScaleFactorSSGI / _HPreviousScaleFactorSSGI) + float2 ReprojectionCoord = float2(pixCoord.xy) - MotionVectors * floor(_ScreenSize.xy / _HScaleFactorSSGI); + ReprojectionCoord /= (HRenderScale.xy / HRenderScalePrevious.xy); + + ReprojectedColor = CurrentData.DepthRaw <= UNITY_RAW_FAR_CLIP_VALUE ? Sky : H_LOAD(_Color_History, ReprojectionCoord + BestOffset).xyz; + + float ReprojectedColorLuma = Luminance(ReprojectedColor); + if (ReprojectedColorLuma > LumaThreshold) + ReprojectedColor *= (LumaThreshold / ReprojectedColorLuma); + + } + } + + Reservoir.W = Reservoir.Wsum / max(Reservoir.M * Luminance(Reservoir.Color * Diffuse), 1e-8); + + _Samplecount_Output[H_COORD(pixCoord.xy)] = Samplecount; + _Radiance_Output[H_COORD(pixCoord.xy)] = float4(ReprojectedRadiance.xyz, 0); + _Reservoir_Output[H_COORD(pixCoord.xy)] = PackTemporalReservoir(Reservoir); + _AmbientOcclusion_Output[H_COORD(pixCoord.xy)] = ReprojectedAmbientOcclusion; + + if (!REPROJECT_COLOR) + { + ReprojectedColor = CurrentData.DepthRaw <= UNITY_RAW_FAR_CLIP_VALUE ? Sky : HBUFFER_COLOR(pixCoord.xy).xyz; + + float ReprojectedColorLuma = Luminance(ReprojectedColor); + if (ReprojectedColorLuma > LumaThreshold) + ReprojectedColor *= (LumaThreshold / ReprojectedColorLuma); + } + + if (FULL_RESOLUTION_REPROJECTION) { _ReprojectedColor_Output[H_COORD(pixCoordUnscaled)] = PackColorHit(ReprojectedColor, MovingPixel); } + if (REPROJECT_SPATIAL_OCCLUSION) { _SpatialOcclusion_Output[H_COORD(pixCoord.xy)] = ReprojectedSpatialOcclusion; } + if (REPROJECT_TEMPORAL_INVALIDITY) { _TemporalInvalidity_Output[H_COORD(pixCoord.xy)] = ReprojectedTemporalInvalidity; } +} + + +// ------------------------ HISTORY COPYING ----------------------- +[numthreads(8, 8, 1)] +void CopyHistory(uint3 pixCoord : SV_DispatchThreadID) +{ + + float3 IndirectLighting = H_LOAD(_HTraceBufferGI, pixCoord.xy).xyz; + float3 DiffuseColor = HBUFFER_DIFFUSE(pixCoord.xy).xyz; + float Metallic = H_LOAD(g_HTraceGBuffer1, pixCoord.xy).x; + + // No Indirect Intensity multiplier here to avoid overblown lighting through the temporal loop + float3 FinalIndirectLighting = IndirectLighting * DiffuseColor * (1 - Metallic); + + _Radiance_Output[H_COORD(pixCoord.xy)] = float4(HBUFFER_COLOR(pixCoord.xy).xyz + FinalIndirectLighting, 0); +} + + +// ------------------------ LUMINANCE MOMENTS GENERATION ------------------------ +[numthreads(8, 8, 1)] +void LuminanceMomentsGeneration(uint3 pixCoord : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) +{ + if (groupIndex == 0) + { GroupMoment1 = 0; GroupMoment2 = 0;} + GroupMemoryBarrierWithGroupSync(); + + // We don't reproject this buffer even if it's from the prev. frame because it's fine for this operation + float2 pixCoordNDC = float2(pixCoord.xy + 0.5) * _ScreenSize.zw; + float3 Color = HBUFFER_DEPTH(pixCoord.xy).x <= UNITY_RAW_FAR_CLIP_VALUE ? EvaluateFallbackSky(H_GET_VIEW_VECTOR_WS(pixCoordNDC)) : H_LOAD(_Color_History, pixCoord.xy).xyz; + float Luma = Luminance(Color); + Luma = clamp(Luma, 0.0, 30); + + float Scale = 4294967295.0f / (30.0f * 30.0f); + uint Moment1 = uint(Luma * Scale / 64.0f); + uint Moment2 = uint(Luma * Luma * Scale / 64.0f); + + InterlockedAdd(GroupMoment1, Moment1); + InterlockedAdd(GroupMoment2, Moment2); + GroupMemoryBarrierWithGroupSync(); + + UNITY_BRANCH + if (groupIndex == 0) + { + float2 Moments = 0; + Moments.x = float(GroupMoment1); + Moments.y = float(GroupMoment2); + + GroupMoment1 = uint(Moments.x / (_ScreenSize.x * _ScreenSize.y / 64)); + GroupMoment2 = uint(Moments.y / (_ScreenSize.x * _ScreenSize.y / 64)); + + uint Index = 0; + InterlockedAdd(_LuminanceMoments[0], GroupMoment1, Index); + InterlockedAdd(_LuminanceMoments[1], GroupMoment2, Index); + } +} + + +// ------------------------ LUMINANCE MOMENTS CLEAR ------------------------ +[numthreads(1, 1, 1)] +void LuminanceMomentsClear(uint3 pixCoord : SV_DispatchThreadID, uint2 groupThreadID : SV_GroupThreadID) +{ + _LuminanceMoments[0] = 0; + _LuminanceMoments[1] = 0; +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute.meta new file mode 100644 index 0000000..c04d8ef --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: c91b570672b56b14ca13f188b77120ab +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Computes/HTemporalReprojectionSSGI.compute + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset new file mode 100644 index 0000000..f413057 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset @@ -0,0 +1,62 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-7993483843299501905 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6bd486065ce11414fa40e631affc4900, type: 3} + m_Name: ProbeVolumesOptions + m_EditorClassIdentifier: + active: 0 + normalBias: + m_OverrideState: 1 + m_Value: 0 + viewBias: + m_OverrideState: 1 + m_Value: 0 + scaleBiasWithMinProbeDistance: + m_OverrideState: 0 + m_Value: 0 + samplingNoise: + m_OverrideState: 1 + m_Value: 0 + animateSamplingNoise: + m_OverrideState: 0 + m_Value: 0 + leakReductionMode: + m_OverrideState: 0 + m_Value: 2 + minValidDotProductValue: + m_OverrideState: 0 + m_Value: 0.1 + occlusionOnlyReflectionNormalization: + m_OverrideState: 0 + m_Value: 1 + intensityMultiplier: + m_OverrideState: 0 + m_Value: 1 + skyOcclusionIntensityMultiplier: + m_OverrideState: 0 + m_Value: 1 + worldOffset: + m_OverrideState: 0 + m_Value: {x: 0, y: 0, z: 0} +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: HTraceSSGI Volume Profile URP + m_EditorClassIdentifier: + components: + - {fileID: -7993483843299501905} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset.meta new file mode 100644 index 0000000..7b02ba7 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: ace954f626dae2f42bd7ce088bf3a88f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/HTraceSSGI Volume Profile URP.asset + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers.meta new file mode 100644 index 0000000..d9527b9 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6d45cf09bd8aeb74da02a17745b1a2fb +timeCreated: 1659620468 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files.meta new file mode 100644 index 0000000..44647ae --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6fd27422052b4b24fa14bee0cd9faf8f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl new file mode 100644 index 0000000..0cedd1a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl @@ -0,0 +1,21 @@ +// Hue, Saturation, Value +// Ranges: +// Hue [0.0, 1.0] +// Sat [0.0, 1.0] +// Lum [0.0, HALF_MAX] +float3 RgbToHsv(float3 c) +{ + const float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + const float e = 1.0e-4; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +float3 HsvToRgb(float3 c) +{ + const float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y); +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl.meta new file mode 100644 index 0000000..7e4e0b3 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4f691d60f06346958b6ee703007d2346 +timeCreated: 1747411471 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/Color.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl new file mode 100644 index 0000000..746ac43 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl @@ -0,0 +1,77 @@ +#pragma once + +Texture2D g_OwenScrambledTexture; +Texture2D g_ScramblingTileXSPP; +Texture2D g_RankingTileXSPP; +Texture2D g_ScramblingTexture; + +float ScramblingValueFloat(uint2 pixelCoord) +{ + pixelCoord = pixelCoord & 255; + return g_ScramblingTexture[uint2(pixelCoord.x, pixelCoord.y)].x; +} + +float2 ScramblingValueFloat2(uint2 pixelCoord) +{ + pixelCoord = pixelCoord & 255; + return g_ScramblingTexture[uint2(pixelCoord.x, pixelCoord.y)].xy; +} + +uint ScramblingValueUInt(uint2 pixelCoord) +{ + pixelCoord = pixelCoord & 255; + return clamp((uint)(g_ScramblingTexture[uint2(pixelCoord.x, pixelCoord.y)].x * 256.0), 0, 255); +} + +uint2 ScramblingValueUInt2(uint2 pixelCoord) +{ + pixelCoord = pixelCoord & 255; + return clamp((uint2)(g_ScramblingTexture[uint2(pixelCoord.x, pixelCoord.y)] * 256.0), uint2(0,0), uint2(255, 255)); +} + +// Wrapper to sample the scrambled low Low-Discrepancy sequence (returns a float) +float GetLDSequenceSampleFloat(uint sampleIndex, uint sampleDimension) +{ + // Make sure arguments are in the right range + sampleIndex = sampleIndex & 255; + // sampleDimension = sampleDimension & 255; + + // Fetch the sequence value and return it + return g_OwenScrambledTexture[uint2(sampleDimension, sampleIndex)]; +} + +// Wrapper to sample the scrambled low Low-Discrepancy sequence (returns an unsigned int) +uint GetLDSequenceSampleUInt(uint sampleIndex, uint sampleDimension) +{ + // Make sure arguments are in the right range + sampleIndex = sampleIndex & 255; + // sampleDimension = sampleDimension & 255; + + // Fetch the sequence value and return it + return clamp((uint)(g_OwenScrambledTexture[uint2(sampleDimension, sampleIndex)] * 256.0), 0, 255); +} + +// This is an implementation of the method from the paper +// "A Low-Discrepancy Sampler that Distributes Monte Carlo Errors as a Blue Noise in Screen Space" by Heitz et al. +float GetBNDSequenceSample(uint2 pixelCoord, uint sampleIndex, uint sampleDimension) +{ + // wrap arguments + pixelCoord = pixelCoord & 127; + sampleIndex = sampleIndex & 255; + sampleDimension = sampleDimension & 255; + + // xor index based on optimized ranking + uint rankingIndex = (pixelCoord.x + pixelCoord.y * 128) * 8 + (sampleDimension & 7); + uint rankedSampleIndex = sampleIndex ^ clamp((uint)(g_RankingTileXSPP[uint2(rankingIndex & 127, rankingIndex / 128)] * 256.0), 0, 255); + + // fetch value in sequence + uint value = clamp((uint)(g_OwenScrambledTexture[uint2(sampleDimension, rankedSampleIndex.x)] * 256.0), 0, 255); + + // If the dimension is optimized, xor sequence value based on optimized scrambling + uint scramblingIndex = (pixelCoord.x + pixelCoord.y * 128) * 8 + (sampleDimension & 7); + float scramblingValue = min(g_ScramblingTileXSPP[uint2(scramblingIndex & 127, scramblingIndex / 128)], 0.999); + value = value ^ uint(scramblingValue * 256.0); + + // Convert to float (to avoid the same 1/256th quantization everywhere, we jitter by the pixel scramblingValue) + return (scramblingValue + value) / 256.0; +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl.meta new file mode 100644 index 0000000..e6e1811 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 65e6e8fcb728c8c4c84222455e57dc80 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Headers/HDRP files/RaytracingSampling.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl new file mode 100644 index 0000000..9dcd8ea --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl @@ -0,0 +1,219 @@ +//pipelinedefine +#define H_URP + +#ifndef HMAIN_INCLUDED +#define HMAIN_INCLUDED + +// TODO: check if we need all these includes or some can be removed? +// --------------------------------- INCLUDE FILES ----------------------------- // + + + +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Sampling/Sampling.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + +// --------------------------------- VALUES ----------------------------- // + +float4 _HRenderScale; +float4 _HRenderScalePrevious; + +#define HRenderScale _HRenderScale +#define HRenderScalePrevious _HRenderScalePrevious + + +uint _FrameCount; + + +// --------------------------------- CONSTANTS ----------------------------- // +#define H_TWO_PI (6.28318530718f) +#define H_PI (3.1415926535897932384626433832795) +#define H_PI_HALF (1.5707963267948966192313216916398) + + +// --------------------------------- TEXTURE SAMPLERS ----------------------------- // + + +SamplerState sampler_point_clamp; +SamplerState sampler_linear_clamp; +SamplerState sampler_point_repeat; +SamplerState sampler_point_mirror; +SamplerState sampler_linear_repeat; +SamplerState sampler_trilinear_clamp; + +#define H_SAMPLER_POINT_CLAMP sampler_point_clamp +#define H_SAMPLER_LINEAR_CLAMP sampler_linear_clamp +#define H_SAMPLER_LINEAR_REPEAT sampler_linear_repeat +#define H_SAMPLER_TRILINEAR_CLAMP sampler_trilinear_clamp + + +// --------------------------------- TEXTURE READ / WRITE HELPERS ----------------------------- // + + +#define H_COORD(pixelCoord) uint2(pixelCoord) //todo: do we need defines for VR? +#define H_INDEX_ARRAY(slot) (slot) + + +// ----------------------------- TEXTURE PROPERTY DECLARATIONS ----------------------------- // + + +#define H_TEXTURE(textureName) TEXTURE2D(textureName) +#define H_TEXTURE_ARRAY(textureName) TEXTURE2D_ARRAY(textureName) + +#define H_RW_TEXTURE(type, textureName) RW_TEXTURE2D(type, textureName) +#define H_RW_TEXTURE_ARRAY(type, textureName) RW_TEXTURE2D_ARRAY(type, textureName) + + +// ----------------------------- TEXTURE FETCH ----------------------------- // + + +#define H_LOAD(textureName, unCoord2) LOAD_TEXTURE2D(textureName, unCoord2) +#define H_LOAD_LOD(textureName, unCoord2, lod) LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) +#define H_LOAD_ARRAY(textureName, unCoord2, index) LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) +#define H_LOAD_ARRAY_LOD(textureName, unCoord2, index, lod) LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) + +#define H_SAMPLE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2) +#define H_SAMPLE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) +#define H_SAMPLE_ARRAY(textureName, samplerName, coord2, index) SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) +#define H_SAMPLE_ARRAY_LOD(textureName, samplerName, coord2, index, lod) SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) + +#define H_GATHER_RED(textureName, samplerName, coord2, offset) GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) +#define H_GATHER_BLUE(textureName, samplerName, coord2, offset) GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) +#define H_GATHER_GREEN(textureName, samplerName, coord2, offset) GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) +#define H_GATHER_ALPHA(textureName, samplerName, coord2, offset) GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) + + +// ---------------------------------- MATRICES ----------------------------- // + + +float4x4 _H_MATRIX_I_P; +float4x4 _H_MATRIX_PREV_VP; +float4x4 _H_MATRIX_PREV_I_VP; + +#define H_MATRIX_PREV_VP _H_MATRIX_PREV_VP +#define H_MATRIX_PREV_I_VP _H_MATRIX_PREV_I_VP +#define H_MATRIX_I_VP UNITY_MATRIX_I_VP +#define H_MATRIX_I_P UNITY_MATRIX_I_P +#define H_MATRIX_VP UNITY_MATRIX_VP +#define H_MATRIX_V UNITY_MATRIX_V +#define H_MATRIX_I_V UNITY_MATRIX_I_V + + +// ------------------------------------- GBUFFER RESOURCES ----------------------------- // + +float4 H_SHAr; +float4 H_SHAg; +float4 H_SHAb; +float4 H_SHBr; +float4 H_SHBg; +float4 H_SHBb; +float4 H_SHC; + +H_TEXTURE(g_HTraceGBuffer0); +H_TEXTURE(g_HTraceGBuffer1); +H_TEXTURE(g_HTraceGBuffer2); +H_TEXTURE(g_HTraceGBuffer3); + +H_TEXTURE(g_HTraceDepth); +H_TEXTURE(g_HTraceDepthPyramidSSGI); +H_TEXTURE(g_HTraceColor); +H_TEXTURE(g_HTraceMotionMask); +H_TEXTURE(g_HTraceMotionVectors); +H_TEXTURE(g_HTraceRenderLayerMask); + +H_TEXTURE(g_HTraceSSAO); + + + +// --------------------------------- GBUFFER FETCH ----------------------------- // +#define HBUFFER_NORMAL_WS(pixCoord) GetNormalWS(pixCoord) +#define HBUFFER_ROUGHNESS(pixCoord) GetRoughness(pixCoord) +#define HBUFFER_DEPTH(pixCoord) GetDepth(pixCoord) +#define HBUFFER_COLOR(pixCoord) GetColor(pixCoord) +#define HBUFFER_DIFFUSE(pixCoord) GetDiffuse(pixCoord) +#define HBUFFER_MOTION_VECTOR(pixCoord) GetMotionVectors(pixCoord) +#define HBUFFER_MOTION_MASK(pixCoord) GetMotionMask(pixCoord) +#define HBUFFER_RENDER_LAYER_MASK(pixCoord) GetRenderLayerMask(pixCoord) + +float3 GetNormalWS(uint2 pixCoord) +{ + + + float3 Normal = H_LOAD(g_HTraceGBuffer2, pixCoord).xyz; + #if defined(_GBUFFER_NORMALS_OCT) + float2 RemappedOctNormalWS = Unpack888ToFloat2(Normal); + float2 OctNormalWS = RemappedOctNormalWS.xy * 2.0 - 1.0; + Normal = UnpackNormalOctQuadEncode(OctNormalWS); + #endif + return Normal; +} + +float GetDepth(uint2 pixCoord) +{ + + + return H_LOAD(g_HTraceDepth, pixCoord).x; +} + +float4 GetColor(uint2 pixCoord) +{ + + + return H_LOAD(g_HTraceColor, pixCoord); +} + +float4 GetDiffuse(uint2 pixCoord) +{ + + + return H_LOAD(g_HTraceGBuffer0, pixCoord).xyzw; +} + + +float2 GetMotionVectors(uint2 pixCoord) +{ + + + return H_LOAD(g_HTraceMotionVectors, pixCoord).xy; +} + + +float GetMotionMask(uint2 pixCoord) +{ + + + return any(H_LOAD(g_HTraceMotionMask, pixCoord).xy != 0); +} + +uint GetRenderLayerMask(uint2 pixCoord) +{ + #if UNITY_VERSION >= 600000 + + + + #if UNITY_VERSION >= 60020000 + return asuint(H_LOAD(g_HTraceRenderLayerMask, pixCoord.xy).x); + #else + float4 RenderLayers = H_LOAD(g_HTraceRenderLayerMask, pixCoord.xy); + return DecodeMeshRenderingLayer(RenderLayers.x); + #endif + + #else + return 0; + #endif +} + +// ---------------------------------- OTHER ----------------------------------------- + + + +#define HGetInversePreviousExposureMultiplier 1 +#define HGetInverseCurrentExposureMultiplier 1 +#define HGetCurrentExposureMultiplier 1 +#define HGetPreviousExposureMultiplier 1 + +#endif // HMAIN_INCLUDED diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl.meta new file mode 100644 index 0000000..1363454 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: a4c2fc6c03cd9d5449598ccc2642ba20 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Headers/HMain.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl new file mode 100644 index 0000000..368f484 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl @@ -0,0 +1,154 @@ +#pragma once + +#define FLT_MIN 1.175494351e-38 +#define FLT_MAX 3.402823466e+38 + +float3 HSafeNormalize(float3 inVec) +{ + float dp3 = max(FLT_MIN, dot(inVec, inVec)); + return inVec * rsqrt(dp3); +} + +float HSinFromCos(float cosX) +{ + return sqrt(saturate(1 - cosX * cosX)); +} + +float HFastSqrt(float x) +{ + return (asfloat(0x1fbd1df5 + (asint(x) >> 1))); +} + +float HFastACos( float inX ) +{ + float pi = 3.141593; + float half_pi = 1.570796; + float x = abs(inX); + float res = -0.156583 * x + half_pi; + res *= HFastSqrt(1.0 - x); + return (inX >= 0) ? res : pi - res; +} + +float3x3 HGetLocalFrame(float3 localZ) +{ + float x = localZ.x; + float y = localZ.y; + float z = localZ.z; + + + float sz = FastSign(z); + float a = 1 / (sz + z); + float ya = y * a; + float b = x * ya; + float c = x * sz; + + float3 localX = float3(c * x * a - 1, sz * b, c); + float3 localY = float3(b, y * ya - sz, y); + + return float3x3(localX, localY, localZ); +} + +float2 HSampleDiskCubic(float u1, float u2) +{ + float r = u1; + float phi = 6.28318530718f * u2; + + float sinPhi, cosPhi; + sincos(phi, sinPhi, cosPhi); + + return r * float2(cosPhi, sinPhi); +} + +float3 HSphericalToCartesian(float cosPhi, float sinPhi, float cosTheta) +{ + float sinTheta = HSinFromCos(cosTheta); + return float3(float2(cosPhi, sinPhi) * sinTheta, cosTheta); +} + +float3 HSphericalToCartesian(float phi, float cosTheta) +{ + float sinPhi, cosPhi; + sincos(phi, sinPhi, cosPhi); + return HSphericalToCartesian(cosPhi, sinPhi, cosTheta); +} + +float3 HSampleSphereUniform(float u1, float u2) +{ + float phi = 6.28318530718f * u2; + float cosTheta = 1.0 - 2.0 * u1; + return HSphericalToCartesian(phi, cosTheta); +} + +float3 HSampleHemisphereCosine(float u1, float u2, float3 normal) +{ + float3 pointOnSphere = HSampleSphereUniform(u1, u2); + return HSafeNormalize(normal + pointOnSphere); +} + + +float2 HLineBoxIntersect(float3 RayOrigin, float3 RayEnd, float3 BoxMin, float3 BoxMax) +{ + float3 InvRayDir = 1.0f / (RayEnd - RayOrigin); + + float3 FirstPlaneIntersections = (BoxMin - RayOrigin) * InvRayDir; + float3 SecondPlaneIntersections = (BoxMax - RayOrigin) * InvRayDir; + float3 ClosestPlaneIntersections = min(FirstPlaneIntersections, SecondPlaneIntersections); + float3 FurthestPlaneIntersections = max(FirstPlaneIntersections, SecondPlaneIntersections); + + float2 BoxIntersections; + BoxIntersections.x = max(ClosestPlaneIntersections.x, max(ClosestPlaneIntersections.y, ClosestPlaneIntersections.z)); + BoxIntersections.y = min(FurthestPlaneIntersections.x, min(FurthestPlaneIntersections.y, FurthestPlaneIntersections.z)); + return saturate(BoxIntersections); +} + +float HUintToFloat01(uint h) +{ + static const uint MantissaMask = 0x007FFFFFu; + static const uint One = 0x3F800000u; + + h &= MantissaMask; + h |= One; + + float r2 = asfloat(h); + return r2 - 1.0; +} + +uint Hash_Combine(uint x, uint y) +{ + static const uint M = 1664525u, C = 1013904223u; + uint seed = (x * M + y + C) * M; + + seed ^= (seed >> 11u); + seed ^= (seed << 7u) & 0x9d2c5680u; + seed ^= (seed << 15u) & 0xefc60000u; + seed ^= (seed >> 18u); + return seed; +} + +uint Hash1(uint x) +{ + x += (x << 10u); + x ^= (x >> 6u); + x += (x << 3u); + x ^= (x >> 11u); + x += (x << 15u); + return x; +} + +uint Hash2(uint2 v) +{ + return Hash_Combine(v.x, Hash1(v.y)); +} + +uint Hash3(uint3 v) +{ + return Hash_Combine(v.x, Hash2(v.yz)); +} + +uint Hash1Mutate(inout uint h) +{ + uint Res = h; + h = Hash1(h); + return Res; +} + diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl.meta new file mode 100644 index 0000000..15c617c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 9742473896537694a88a5b10866e1a9c +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Headers/HMath.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl new file mode 100644 index 0000000..cce234c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl @@ -0,0 +1,144 @@ +#pragma once + + + + +// --------------------------------- GET CAMERA POSITION +float3 H_GET_CAMERA_POSITION_WS() +{ + + + return _WorldSpaceCameraPos; +} + + +// --------------------------------- GET ABSOLUTE WS POSITION +float3 H_GET_ABSOLUTE_POSITION_WS(float3 PositionWS) +{ + + + return PositionWS; +} + + +// --------------------------------- GET RELATIVE WS POSITION +float3 H_GET_RELATIVE_POSITION_WS(float3 PositionWS) +{ + + + return GetCameraRelativePositionWS(PositionWS); +} + + +// --------------------------------- GET NORMALIZED WS VIEW DIRECTION +float3 H_GET_VIEW_DIRECTION_WS(float3 PositionWS) +{ + float3 ViewDirectionWS = H_GET_CAMERA_POSITION_WS() - H_GET_ABSOLUTE_POSITION_WS(PositionWS); + return normalize(ViewDirectionWS); +} + + +// --------------------------------- GET NORMALIZED WS VIEW VECTOR +float3 H_GET_VIEW_VECTOR_WS(float2 pixCoordNDC) +{ + float4 PositionVS = mul(H_MATRIX_I_P, float4(pixCoordNDC * 2.0 - 1.0, 1.0, 1.0)); + float3 DirectionVS = normalize(float3(PositionVS.x, -PositionVS.y, PositionVS.z)); + return normalize(mul((float3x3)H_MATRIX_I_V, DirectionVS)); +} + + +// --------------------------------- COMPUTE CLIP SPACE POSITION +float4 H_COMPUTE_POSITION_CS(float2 pixCoordNDC, float Depth) +{ + float4 PositionCS = float4(pixCoordNDC * 2.0 - 1.0, Depth, 1.0); + + #if UNITY_UV_STARTS_AT_TOP + PositionCS.y = -PositionCS.y; + #endif + + return PositionCS; +} + + +// --------------------------------- COMPUTE CLIP SPACE POSITION +float3 H_COMPUTE_NDC_Z(float3 Position, float4x4 InvViewProjMatrix) +{ + + return ComputeNormalizedDeviceCoordinatesWithZ(Position, InvViewProjMatrix); + +} + + +// --------------------------------- COMPUTE WORLD SPACE POSITION +float3 H_COMPUTE_POSITION_WS(float2 pixCoordNDC, float Depth, float4x4 InvViewProjMatrix) +{ + + return ComputeWorldSpacePosition(pixCoordNDC, Depth, InvViewProjMatrix); + +} + + +// --------------------------------- WORLD TO VIEW DIRECTION +float3 H_TRANSFORM_WORLD_TO_VIEW_DIR(float3 DirectionWS, bool Normalize = false) +{ + float3 DirectionVS = mul((float3x3)H_MATRIX_V, DirectionWS).xyz; + if (Normalize) return normalize(DirectionVS); + + return DirectionVS; +} + + +// --------------------------------- VIEW TO WORLD DIRECTION +float3 H_TRANSFORM_VIEW_TO_WORLD_DIR(float3 DirectionVS, bool Normalize = false) +{ + float3 DirectionWS = mul((float3x3)H_MATRIX_I_V, DirectionVS).xyz; + if (Normalize) return normalize(Normalize); + + return DirectionWS; +} + + +// --------------------------------- WORLD TO VIEW NOWMAL +float3 H_TRANSFORM_WORLD_TO_VIEW_NORMAL(float3 NormalWS, bool Normalize = false) +{ + + return TransformWorldToViewNormal(NormalWS); + +} + + + +// --------------------------------- VIEW TO WORLD NOWMAL +float3 H_TRANSFORM_VIEW_TO_WORLD_NORMAL(float3 NormalVS, bool Normalize = false) +{ + + return TransformViewToWorldNormal(NormalVS); + +} + + + +// --------------------------------- RAW TO 01 LINEAR DEPTH +float H_LINEAR_01_DEPTH(float Depth) +{ + + + return Linear01Depth(Depth, _ZBufferParams); +} + + +// --------------------------------- RAW TO EYE LINEAR DEPTH +float H_LINEAR_EYE_DEPTH(float3 PositionWS, float4x4 ViewMatrix) +{ + + + return LinearEyeDepth(PositionWS, ViewMatrix); +} + + +float H_LINEAR_EYE_DEPTH(float Depth) +{ + + + return LinearEyeDepth(Depth, _ZBufferParams); +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl.meta new file mode 100644 index 0000000..8032941 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 60126f3b2f7939246ab1d0c0e26f670f +timeCreated: 1727882853 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Headers/HSpaceTransforms.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes.meta new file mode 100644 index 0000000..086a44d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc41ad21f8ea07c458acca5c5c52c745 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl new file mode 100644 index 0000000..6cd7b48 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl @@ -0,0 +1,237 @@ +#include "../Headers/HMain.hlsl" +#include "../Headers/HMath.hlsl" +#include "../Headers/HSpaceTransforms.hlsl" + +#define ENABLE_RCRS_FILTER 1 +#define ENABLE_EXPOSURE_CONTROL 1 + +#define ENABLE_SPATIAL_RESTIR 1 +#define ENABLE_TEMPORAL_RESTIR 1 + +#define ENABLE_SPATIAL_DENOISING 1 +#define ENABLE_TEMPORAL_DENOISING 1 +#define ENABLE_TEMPORAL_STABILIZATION 1 + + +// ------------------------ COMMON PROPERTIES ------------------------- +float _HScaleFactorSSGI; +float _HPreviousScaleFactorSSGI; + +float _Falloff; +float4 _APVParams; +float4 _DepthToViewParams; + +uint _ExcludeCastingLayerMaskSSGI; +uint _ExcludeReceivingLayerMaskSSGI; + + +// ------------------------ SCALING FUNCTIONS ------------------------- +uint2 GetUnscaledCoords(uint2 pixCoord) +{ + return round(pixCoord.xy * _HScaleFactorSSGI.xx); +} + + +// ------------------------ SAMPLING FUNCTIONS ------------------------- +float ProbePlaneWeighting(float4 Plane, float3 WorldPosSample, float DepthLinearCenter, float Multiplier) +{ + float PlaneDistance = abs(dot(float4(WorldPosSample, -1), Plane)); + float DepthDifference = PlaneDistance / DepthLinearCenter; + float PlaneWeight = exp2(-100.0f * Multiplier * (DepthDifference * DepthDifference)); + return PlaneWeight; +} + +float3 ComputeFastViewSpacePosition(float2 pixCoordNDC, float Depth, float DepthLinear) +{ + #ifdef VR_COMPATIBILITY + return ComputeViewSpacePosition(pixCoordNDC, Depth, UNITY_MATRIX_I_P) * float3(1, -1, 1); + #endif + + float3 PositionVS = float3((pixCoordNDC * _DepthToViewParams.xy + _DepthToViewParams.zw) * DepthLinear.xx, DepthLinear); + return float3(PositionVS.x, PositionVS.y, -PositionVS.z); +} + +float ExponentialFalloff(float HitDistance, float MaxDistance) +{ + float Falloff = 0; + + float Threshold = 0.35 * MaxDistance; + if (HitDistance <= Threshold) + Falloff = 1.0; + + float NormalizedDistance = saturate((HitDistance - Threshold) / (MaxDistance - Threshold)); + Falloff = exp2(-(_Falloff * 3) * NormalizedDistance); + + return Falloff; +} + +float RadicalInverseVdC(uint bits) +{ + bits = (bits << 16) | (bits >> 16); + bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1); + bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2); + bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4); + bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); + return float(bits) * 2.3283064365386963e-10; +} + +float2 SampleUnitDisk(uint Index) +{ + float Angle = RadicalInverseVdC(Index) * 2.0 * H_PI; + float Radius = sqrt(frac(float(Index) * 0.61803398875)); // Golden ratio for decorrelation + return float2(cos(Angle), sin(Angle)) * Radius; +} + +inline float Jitter(float2 Coord) +{ + float a = 12.9898; + float b = 78.233; + float c = 43758.5453; + float dt = dot(Coord.xy, float2(a, b)); + float sn = fmod(dt, 3.14); + return frac(sin(sn) * c); +} + +float sqr(float value) +{ + return value * value; +} + +float GaussianWeighting(float Radius, float Sigma) +{ + return exp2(-sqr(Radius / Sigma)); +} + +float3 SpatialDenoisingTonemap(float3 Color) +{ + return Color * rcp(max(max(Color.r, Color.g), Color.b) + 1.0); +} + +float3 SpatialDenoisingTonemapInverse(float3 Color) +{ + return Color * rcp(1.0 - max(max(Color.r, Color.g), Color.b)); +} + +// ------------------------ Color.hlsl in HDRP ------------------------- + +float HInterleavedGradientNoise(float2 pixCoord, int frameCount) +{ + const float3 magic = float3(0.06711056f, 0.00583715f, 52.9829189f); + float2 frameMagicScale = float2(2.083f, 4.867f); + pixCoord += frameCount * frameMagicScale; + return frac(magic.z * frac(dot(pixCoord, magic.xy))); +} + +// ------------------------ PACKING FUNCTIONS ------------------------- + +uint PackDirection32Bit(float3 Direction) +{ + float2 DirectionOctahedral = PackNormalOctQuadEncode(Direction); + DirectionOctahedral = DirectionOctahedral * 0.5f + 0.5f; + + uint DirectionX = uint(DirectionOctahedral.x * 65534.0f + 0.5f); + uint DirectionY = uint(DirectionOctahedral.y * 65534.0f + 0.5f); + return (DirectionX << 16) | (DirectionY << 0); +} + +float3 UnpackDirection32Bit(uint PackedDirection) +{ + float3 Direction; + Direction.x = float((PackedDirection >> 16) & 0xFFFF) / 65534.0f; + Direction.y = float((PackedDirection >> 0) & 0xFFFF) / 65534.0f; + Direction = UnpackNormalOctQuadEncode(Direction.xy * 2.0f - 1.0f); + return Direction; +} + +uint PackDirection24Bit(float3 Direction) +{ + float2 DirectionOctahedral = PackNormalOctQuadEncode(Direction); + DirectionOctahedral = DirectionOctahedral * 0.5f + 0.5f; + + uint DirectionX = uint(DirectionOctahedral.x * 4095.0f + 0.5f); + uint DirectionY = uint(DirectionOctahedral.y * 4095.0f + 0.5f); + return (DirectionX << 12) | (DirectionY << 0); +} + +float3 UnpackDirection24Bit(uint PackedDirection) +{ + float3 Direction; + Direction.x = float((PackedDirection >> 12) & 0xFFF) / 4095.0f; + Direction.y = float((PackedDirection >> 0) & 0xFFF) / 4095.0f; + Direction = UnpackNormalOctQuadEncode(Direction.xy * 2.0f - 1.0f); + return Direction; +} + +uint PackDirection16Bit(float3 Direction) +{ + float2 DirectionOctahedral = PackNormalOctQuadEncode(Direction); + DirectionOctahedral = DirectionOctahedral * 0.5f + 0.5f; + + uint DirectionX = uint(DirectionOctahedral.x * 255.0f + 0.5f); + uint DirectionY = uint(DirectionOctahedral.y * 255.0f + 0.5f); + return (DirectionX << 8) | (DirectionY << 0); +} + +float3 UnpackDirection16Bit(uint PackedDirection) +{ + float3 Direction; + Direction.x = float((PackedDirection >> 8) & 0xFF) / 255.0f; + Direction.y = float((PackedDirection >> 0) & 0xFF) / 255.0f; + Direction = UnpackNormalOctQuadEncode(Direction.xy * 2.0f - 1.0f); + return Direction; +} + +uint PackAmbientOcclusion(float AmbientOcclusion) +{ + uint AmbientOcclusionPacked = AmbientOcclusion * 255.0f + 0.5f; + return AmbientOcclusionPacked; +} + +float UnpackAmbientOcclusion(uint AmbientOcclusionPacked) +{ + float AmbientOcclusion = float(AmbientOcclusionPacked) / 255.0f; + return AmbientOcclusion; +} + +uint PackColorHit(float3 Color, bool Hit) +{ + uint R = (f32tof16(Color.r) << 17) & 0xFFE00000; + uint G = (f32tof16(Color.g) << 6) & 0x001FF800; + uint B = (f32tof16(Color.b) >> 4) & 0x000007FE; + uint A = Hit ? 0x00000001 : 0x00000000; + return R | G | B | A; +} + +float3 UnpackColorHit(uint ColorHitPacked, inout bool Hit) +{ + float3 Color; + Color.r = f16tof32((ColorHitPacked >> 17) & 0x7FF0); + Color.g = f16tof32((ColorHitPacked >> 6) & 0x7FF0); + Color.b = f16tof32((ColorHitPacked << 4) & 0x7FE0); + Hit = (ColorHitPacked & 0x00000001) == 0x00000001 ? true : false; + return Color; +} + +uint PackNormalDepth(float3 Normal, float Depth) +{ + float2 NormalOctahedral = PackNormalOctQuadEncode(Normal); + NormalOctahedral = NormalOctahedral * 0.5f + 0.5f; + uint NormalX = uint(NormalOctahedral.x * 255.0f + 0.5f); + uint NormalY = uint(NormalOctahedral.y * 255.0f + 0.5f); + + uint DepthPacked = f32tof16(Depth); + return (DepthPacked << 16) | (NormalX << 8) | (NormalY << 0); +} + +float4 UnpackNormalDepth(uint NormalDepthPacked) +{ + float2 Normal; + float4 NormalDepth; + Normal.x = float((NormalDepthPacked >> 8) & 0xFF) / 255.0f; + Normal.y = float((NormalDepthPacked >> 0) & 0xFF) / 255.0f; + NormalDepth.xyz = UnpackNormalOctQuadEncode(Normal * 2.0f - 1.0f); + + NormalDepth.w = f16tof32(NormalDepthPacked >> 16); + + return NormalDepth.xyzw; +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl.meta new file mode 100644 index 0000000..9e4a2a3 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: da57d648cbc5caf44837dabea199a907 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Includes/HCommonSSGI.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl new file mode 100644 index 0000000..d308fe5 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl @@ -0,0 +1,66 @@ +//pipelinedefine +#define H_URP + + +#if UNITY_VERSION >= 600000 +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/AmbientProbe.hlsl" +#include "Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.hlsl" + +float3 EvaluateFallbackSky(float3 Direction) +{ + unity_SHAr = H_SHAr; + unity_SHAg = H_SHAg; + unity_SHAb = H_SHAb; + unity_SHBr = H_SHBr; + unity_SHBg = H_SHBg; + unity_SHBb = H_SHBb; + unity_SHC = H_SHC; + + return EvaluateAmbientProbe(Direction); +} + +float3 EvaluateFallbackAPV(float4 APVParams, float3 PositionWS, float3 NormalWS, float3 ViewDirection, float2 pixCoord) +{ + float3 BakedAPV = 0; + float3 Unused = 0; + + _APVSamplingNoise = APVParams.z; + PositionWS = AddNoiseToSamplingPosition(PositionWS, pixCoord, ViewDirection); + PositionWS = (PositionWS + NormalWS * APVParams.x) + ViewDirection * APVParams.y; + + unity_SHAr = H_SHAr; + unity_SHAg = H_SHAg; + unity_SHAb = H_SHAb; + unity_SHBr = H_SHBr; + unity_SHBg = H_SHBg; + unity_SHBb = H_SHBb; + unity_SHC = H_SHC; + + EvaluateAdaptiveProbeVolume(PositionWS, NormalWS, -NormalWS, ViewDirection, pixCoord, BakedAPV, Unused); + + #ifdef FALLBACK_STAGE + BakedAPV *= APVParams.w; + #endif + + return BakedAPV; +} +#else +#include "Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBlendStates.hlsl" +#include "Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.hlsl" + +float3 EvaluateFallbackAPV(float4 APVParams, float3 PositionWS, float3 NormalWS, float3 ViewDirection, int2 pixCoord) +{ + return 0; +} + +float3 EvaluateFallbackSky(float3 Direction) +{ + float3 Sky = SHEvalLinearL0L1(Direction, H_SHAr, H_SHAg, H_SHAb); + Sky += SHEvalLinearL2(Direction, H_SHBr, H_SHBg, H_SHBb, H_SHC); + + return max(Sky, 0); +} +#endif + + + diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl.meta new file mode 100644 index 0000000..29b00bf --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: ad1d271555f9ba343b68747597d2cae6 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Includes/HFallbackSSGI.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl new file mode 100644 index 0000000..4218b74 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl @@ -0,0 +1,195 @@ +#ifdef FULL_RESOLUTION_DEPTH +#define MAX_DEPTH_MIP_LEVEL 0 +#else +#define MAX_DEPTH_MIP_LEVEL 1 +#endif + +#include "HReservoirSSGI.hlsl" + +uint _StepCount; +float _RayLength; +float _BackfaceLighting; +float4 _ThicknessParams; + +H_TEXTURE(_Color); + + +float GetRayOriginAndDirectionNDC(float MaxLength, float Depth, float2 pixCoordNDC, float3 PositionWS, float3 RayDirectionWS, float3 NormalWS, inout float3 RayOriginBiasedWS, inout float3 RayStartPositionNDC, inout float3 RayEndPositionNDC) +{ + // Bias ray origin in world space + { + RayOriginBiasedWS = PositionWS; + float3 NormalForBias = dot(NormalWS, RayDirectionWS) < 0 ? -NormalWS : NormalWS; + + // Calculate normal bias + float2 CornerCoordNDC = pixCoordNDC + 0.5f * _ScreenSize.zw; + float3 CornerPositionWS = H_COMPUTE_POSITION_WS(CornerCoordNDC.xy, Depth, H_MATRIX_I_VP); + float NormalBias = abs(dot(CornerPositionWS - PositionWS, NormalForBias)) * 2.0f; + + // This can push the ray origin off-screen causing black pixels on the border + RayOriginBiasedWS += NormalForBias * max(NormalBias, 0.01f) + RayDirectionWS * 0.01f; + } + + // Calculate ray start position in screen space + RayStartPositionNDC = H_COMPUTE_NDC_Z(RayOriginBiasedWS, H_MATRIX_VP).xyz; + + // Calculate ray end clipped position in screen space + { + // Calculate clipped ray distance in world space + float MaxRayDistanceWS = MaxLength; + + float3 RayDirectionVS = H_TRANSFORM_WORLD_TO_VIEW_DIR(-RayDirectionWS, true); + float SceneDepth = H_LINEAR_EYE_DEPTH(RayOriginBiasedWS, H_MATRIX_V); + float RayClippedDistanceWS = RayDirectionVS.z < 0.0 ? min(-0.99f * SceneDepth / RayDirectionVS.z, MaxRayDistanceWS) : MaxRayDistanceWS; + + // Calculate ray end position in screen space + RayEndPositionNDC.xyz = H_COMPUTE_NDC_Z(RayOriginBiasedWS + RayDirectionWS * RayClippedDistanceWS, H_MATRIX_VP).xyz; + + // Recalculate ray end position where it leaves the screen + float2 ScreenEdgeIntersections = HLineBoxIntersect(RayStartPositionNDC, RayEndPositionNDC, 0, 1); + RayEndPositionNDC = RayStartPositionNDC + (RayEndPositionNDC - RayStartPositionNDC) * ScreenEdgeIntersections.y; + + return ScreenEdgeIntersections.y; + } +} + +float2 GetWorkingDepth(float SurfaceDepth, float RayDepth) +{ + #ifdef LINEAR_THICKNESS + return float2(SurfaceDepth, RayDepth); + #else + return float2(H_LINEAR_EYE_DEPTH(SurfaceDepth), H_LINEAR_EYE_DEPTH(RayDepth)); + #endif +} + +bool WorkingDepthCompare(float SurfaceDepth, float RayDepth, float2 ThicknessParams) +{ + #ifdef LINEAR_THICKNESS + return RayDepth > SurfaceDepth * ThicknessParams.x + ThicknessParams.y; + #else + return RayDepth < SurfaceDepth * ThicknessParams.x + ThicknessParams.y; + #endif +} + + +float4 RayMarch(float3 RayStartPositionNDC, float3 RayEndPositionNDC, float StepJitter) +{ + int StepCount = _StepCount; + + bool HitFound = false; + bool SkyPassed = false; + + float3 HitCoordNDC = 0; + float3 PreviousPositionNDC = RayStartPositionNDC; + + for (int i = 0; i < StepCount; i++) + { + float3 SamplePositionNDC = lerp(RayStartPositionNDC, RayEndPositionNDC, pow(float(min(float(StepCount), i + StepJitter * 1)) / float(StepCount), 2)); + + uint DepthLOD = lerp(MAX_DEPTH_MIP_LEVEL, 4, (float(i)) / StepCount); + float SurfaceDepth = H_SAMPLE_LOD(g_HTraceDepthPyramidSSGI, H_SAMPLER_POINT_CLAMP, SamplePositionNDC.xy * HRenderScale.xy, DepthLOD).x; + + if (SurfaceDepth <= 0) + { + SkyPassed = true; + } + + if (SamplePositionNDC.z < SurfaceDepth) + { + float2 WorkingDepth = GetWorkingDepth(SurfaceDepth, SamplePositionNDC.z); + + if (WorkingDepthCompare(WorkingDepth.x, WorkingDepth.y, _ThicknessParams.xy)) + { + HitCoordNDC = SamplePositionNDC.xyz; + HitFound = true; + break; + } + if (REFINE_INTERSECTION && WorkingDepthCompare(WorkingDepth.x, WorkingDepth.y, _ThicknessParams.zw)) + { + float3 MiddlePositionNDC = lerp(SamplePositionNDC, PreviousPositionNDC, 0.25f); + float MiddleSurfaceDepth = H_SAMPLE_LOD(g_HTraceDepthPyramidSSGI, H_SAMPLER_POINT_CLAMP, MiddlePositionNDC.xy * HRenderScale.xy, DepthLOD).x; + float2 MiddleWorkingDepth = GetWorkingDepth(MiddleSurfaceDepth, MiddlePositionNDC.z); + + if (WorkingDepthCompare(MiddleWorkingDepth.x, MiddleWorkingDepth.y, _ThicknessParams.xy)) // && SurfaceDepth > 0) + { + HitCoordNDC = MiddlePositionNDC.xyz; + HitFound = true; + break; + } + } + } + + PreviousPositionNDC = SamplePositionNDC; + } + + HitCoordNDC = SkyPassed ? PreviousPositionNDC : HitCoordNDC; + + return float4(HitCoordNDC.xyz, HitFound); +} + + +float4 RayMarchHalf(float3 RayStartPositionNDC, float3 RayEndPositionNDC, float StepJitter) +{ + int StepCount = _StepCount / 2; + uint FirstStep = _FrameCount % 2; + + bool HitFound = false; + bool SkyPassed = false; + + float3 HitCoordNDC = 0; + float3 PreviousPositionNDC = RayStartPositionNDC; + + for (int i = FirstStep; i < StepCount; i = i + 2) + { + float3 SamplePositionNDC = lerp(RayStartPositionNDC, RayEndPositionNDC, pow(float(min(StepCount, i + StepJitter * 1)) / StepCount, 2)); + + uint DepthLOD = lerp(MAX_DEPTH_MIP_LEVEL, 4, (float(i)) / StepCount); + float SurfaceDepth = H_SAMPLE_LOD(g_HTraceDepthPyramidSSGI, H_SAMPLER_POINT_CLAMP, SamplePositionNDC.xy * HRenderScale.xy, DepthLOD).x; + + if (SurfaceDepth <= 0) + { + SkyPassed = true; + } + + if (SamplePositionNDC.z < SurfaceDepth) + { + float2 WorkingDepth = GetWorkingDepth(SurfaceDepth, SamplePositionNDC.z); + + if (WorkingDepthCompare(WorkingDepth.x, WorkingDepth.y, _ThicknessParams.xy)) + { + HitCoordNDC = SamplePositionNDC.xyz; + HitFound = true; + break; + } + else if (REFINE_INTERSECTION && WorkingDepthCompare(WorkingDepth.x, WorkingDepth.y, _ThicknessParams.zw)) + { + float3 MiddlePositionNDC = lerp(SamplePositionNDC, PreviousPositionNDC, 0.25f); + float MiddleSurfaceDepth = H_SAMPLE_LOD(g_HTraceDepthPyramidSSGI, H_SAMPLER_POINT_CLAMP, MiddlePositionNDC.xy * HRenderScale.xy, DepthLOD).x; + float2 MiddleWorkingDepth = GetWorkingDepth(MiddleSurfaceDepth, MiddlePositionNDC.z); + + if (WorkingDepthCompare(MiddleWorkingDepth.x, MiddleWorkingDepth.y, _ThicknessParams.xy)) + { + HitCoordNDC = MiddlePositionNDC.xyz; + HitFound = true; + break; + } + } + } + + PreviousPositionNDC = SamplePositionNDC; + } + + HitCoordNDC = SkyPassed ? PreviousPositionNDC : HitCoordNDC; + + return float4(HitCoordNDC.xyz, HitFound); +} + + +float4 RayMarchValidation(float3 RayStartPositionNDC, float3 RayEndPositionNDC, float StepJitter) +{ + #ifdef HALF_STEP_VALIDATION + return RayMarchHalf(RayStartPositionNDC, RayEndPositionNDC, StepJitter); + #else + return RayMarch(RayStartPositionNDC, RayEndPositionNDC, StepJitter); + #endif +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl.meta new file mode 100644 index 0000000..68e2a49 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: d70f0a4fb67872c4eb21e7facb552b46 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Includes/HRayMarchingSSGI.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl new file mode 100644 index 0000000..7ca0149 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl @@ -0,0 +1,242 @@ +#include "HCommonSSGI.hlsl" + +H_TEXTURE(_Reservoir); +H_TEXTURE(_ReservoirReprojected); +H_TEXTURE(_ReservoirLuminance); + +H_RW_TEXTURE(uint4, _Reservoir_Output); +H_RW_TEXTURE(uint4, _ReservoirSpatial_Output); +H_RW_TEXTURE(uint4, _ReservoirTemporal_Output); +H_RW_TEXTURE(float, _ReservoirLuminance_Output); + +float _ReservoirDiffuseWeight; + +// ------------------------ RESERVOIR STRUCTS ----------------------- +struct OcclusionReservoir +{ + // Main + float Occlusion; + float Wsum; + float M; + float W; + + // Ray + float3 Direction; + float Distance; +}; + +struct TemporalReservoir +{ + // Main + float3 Color; + float Wsum; + float M; + float W; + + // Origin + float3 OriginNormal; + + // Ray + float3 Direction; + float Distance; + bool HitFound; +}; + +struct SpatialReservoir +{ + // Main + float3 Color; + float Wsum; + float M; + float W; + + // Denoiser + float3 Normal; + float Depth; + float Occlusion; + + // Ray + float3 Direction; + float Distance; + bool HitFound; +}; + + +// ------------------------ PACKING FUNCTIONS ----------------------- + +uint4 PackTemporalReservoir(TemporalReservoir Reservoir) +{ + uint W = f32tof16(Reservoir.W); + uint M = f32tof16(Reservoir.M); + uint PackedMW = (W << 16) | (M & 0xFFFE) | (Reservoir.HitFound & 0x1); + uint PackedColorHit = PackToR11G11B10f(Reservoir.Color); // PackColorHit(Reservoir.Color, Reservoir.HitFound); + uint PackedDistance = f32tof16(Reservoir.Distance); // uint(Reservoir.Distance * 65534.0f + 0.5f); + uint PackedDirection = PackDirection32Bit(Reservoir.Direction); + uint PackedOriginaNormal = PackDirection16Bit(Reservoir.OriginNormal); + uint PackedNormalDistance = (PackedDistance << 16) | (PackedOriginaNormal << 0); + + return uint4(PackedColorHit, PackedMW, PackedDirection, PackedNormalDistance); +} + +void UnpackTemporalReservoir(uint4 ReservoirPacked, float3 Diffuse, inout TemporalReservoir Reservoir) +{ + Reservoir.HitFound = ReservoirPacked.y & 0x1; + Reservoir.Color = UnpackFromR11G11B10f(ReservoirPacked.x); // UnpackColorHit(ReservoirPacked.x, Reservoir.HitFound); + Reservoir.W = f16tof32(ReservoirPacked.y >> 16); + Reservoir.M = f16tof32(ReservoirPacked.y & 0xFFFE); + Reservoir.Wsum = Reservoir.W * Reservoir.M * Luminance(Reservoir.Color * Diffuse); + Reservoir.Distance = f16tof32(ReservoirPacked.w >> 16); + Reservoir.Direction = UnpackDirection32Bit(ReservoirPacked.z); + Reservoir.OriginNormal = UnpackDirection16Bit(ReservoirPacked.w); +} + +uint4 PackSpatialReservoir(SpatialReservoir Reservoir) +{ + uint W = f32tof16(Reservoir.W); + uint M = f32tof16(Reservoir.M); + uint PackedMW = (W << 16) | (M & 0xFFFE) | (Reservoir.HitFound & 0x1); + uint PackedColor = PackToR11G11B10f(Reservoir.Color); + uint PackedDistance = (uint(f32tof16(Reservoir.Distance)) >> 6) & 0x3FF; + uint PackedDirection = PackDirection16Bit(Reservoir.Direction) & 0xFFFF; + uint PackedOcclusion = uint(Reservoir.Occlusion * 63.0f + 0.5f) & 0x3F; + uint PackedDirectionDistanceOcclusion = (PackedDirection << 16) | (PackedOcclusion << 10) | (PackedDistance << 0); + uint DepthPacked = f32tof16(Reservoir.Depth) & 0xFFFF; + uint NormalPacked = PackDirection16Bit(Reservoir.Normal) & 0xFFFF; + uint NormalDepthPacked = (NormalPacked << 16) | (DepthPacked << 0); + + return uint4(PackedColor, PackedMW, PackedDirectionDistanceOcclusion, NormalDepthPacked); +} + +void UnpackSpatialReservoir(uint4 ReservoirPacked, float3 Diffuse, inout SpatialReservoir Reservoir) +{ + Reservoir.HitFound = ReservoirPacked.y & 0x1; + Reservoir.Color = UnpackFromR11G11B10f(ReservoirPacked.x); + Reservoir.W = f16tof32(ReservoirPacked.y >> 16); + Reservoir.M = f16tof32(ReservoirPacked.y >> 0); + Reservoir.Wsum = Reservoir.W * Reservoir.M * Luminance(Reservoir.Color * Diffuse); + Reservoir.Distance = f16tof32((ReservoirPacked.z & 0x3FF) << 6); + Reservoir.Occlusion = float((ReservoirPacked.z >> 10) & 0x3F) / 63; + Reservoir.Direction = UnpackDirection16Bit((ReservoirPacked.z >> 16) & 0xFFFF); + Reservoir.Normal = UnpackDirection16Bit((ReservoirPacked.w >> 16) & 0xFFFF); + Reservoir.Depth = f16tof32(ReservoirPacked.w & 0xFFFF); +} + + +// ------------------------ RESERVOIR FUNCTIONS ----------------------- +float3 GetReservoirDiffuse(uint2 pixCoord) +{ + float3 DiffuseBuffer = HBUFFER_DIFFUSE(pixCoord).xyz * _ReservoirDiffuseWeight; + + if (DiffuseBuffer.x + DiffuseBuffer.y + DiffuseBuffer.z <= 0.05f) + DiffuseBuffer = float3(0.05f, 0.05f, 0.05f); + + return DiffuseBuffer; +} + +// Spatial reservoir exchange +bool ReservoirUpdate(SpatialReservoir SampleReservoir, inout SpatialReservoir MainReservoir, inout uint Random) +{ + float RandomValue = HUintToFloat01(Hash1Mutate(Random)); + + MainReservoir.Wsum += SampleReservoir.Wsum; + MainReservoir.M += SampleReservoir.M; + + if (RandomValue < SampleReservoir.Wsum / MainReservoir.Wsum) + { + MainReservoir.Color = SampleReservoir.Color; + MainReservoir.HitFound = SampleReservoir.HitFound; + MainReservoir.Distance = SampleReservoir.Distance; + MainReservoir.Direction = SampleReservoir.Direction; + + return true; + } + + return false; +} + +// Temporal reservoir exchange +bool ReservoirUpdate(TemporalReservoir SampleReservoir, inout TemporalReservoir MainReservoir, inout uint Random) +{ + float RandomValue = HUintToFloat01(Hash1Mutate(Random)); + + MainReservoir.Wsum += SampleReservoir.Wsum; + MainReservoir.M += SampleReservoir.M; + + if (RandomValue < SampleReservoir.Wsum / MainReservoir.Wsum) + { + MainReservoir.Color = SampleReservoir.Color; + MainReservoir.HitFound = SampleReservoir.HitFound; + MainReservoir.Distance = SampleReservoir.Distance; + MainReservoir.Direction = SampleReservoir.Direction; + MainReservoir.OriginNormal = SampleReservoir.OriginNormal; + + return true; + } + + return false; +} + + +// Radiance reservoir fill +bool ReservoirUpdate(float3 SampleColor, float3 SampleNormal, bool HitFound, float SampleW, float SampleM, inout TemporalReservoir Reservoir, inout uint Random) +{ + float RandomValue = HUintToFloat01(Hash1Mutate(Random)); + + Reservoir.Wsum += SampleW; + Reservoir.M += SampleM; + + if (RandomValue < SampleW / Reservoir.Wsum) + { + Reservoir.Color = SampleColor; + Reservoir.HitFound = HitFound; + Reservoir.OriginNormal = SampleNormal; + + return true; + } + + return false; +} + + +// Radiance reservoir fill +bool ReservoirUpdate(float3 SampleColor, float3 SampleDirection, float3 SampleNormal, float SampleDistance, bool HitFound, float SampleW, float SampleM, inout TemporalReservoir Reservoir, inout uint Random) +{ + float RandomValue = HUintToFloat01(Hash1Mutate(Random)); + + Reservoir.Wsum += SampleW; + Reservoir.M += SampleM; + + if (RandomValue < SampleW / Reservoir.Wsum) + { + Reservoir.Color = SampleColor; + Reservoir.HitFound = HitFound; + Reservoir.Distance = SampleDistance; + Reservoir.Direction = SampleDirection; + Reservoir.OriginNormal = SampleNormal; + + return true; + } + + return false; +} + + +// Occlusion reservoir fill +bool ReservoirUpdate(float SampleOcclusion, float3 SampleDirection, float SampleDistance, float SampleW, float SampleM, inout OcclusionReservoir Reservoir, inout uint Random) +{ + float RandomValue = HUintToFloat01(Hash1Mutate(Random)); + + Reservoir.Wsum += SampleW; + Reservoir.M += SampleM; + + if (RandomValue < SampleW / Reservoir.Wsum) + { + Reservoir.Distance = SampleDistance; + Reservoir.Direction = SampleDirection; + Reservoir.Occlusion = SampleOcclusion; + + return true; + } + + return false; +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl.meta new file mode 100644 index 0000000..8b75a45 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: d85ff336dd0f7d34c938a3c1920ae46a +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Includes/HReservoirSSGI.hlsl + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders.meta new file mode 100644 index 0000000..0b72dc7 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 34ae425a90532074bae6cd5dbd2aafe5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP.meta new file mode 100644 index 0000000..95a637d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e08fec73177458e4186aa8fdc8e7961d +timeCreated: 1730137400 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader new file mode 100644 index 0000000..8856a8e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader @@ -0,0 +1,210 @@ +Shader "Hidden/HTraceSSGI/ColorComposeURP" +{ + SubShader + { + HLSLINCLUDE + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + struct Attributes + { + uint VertexID : SV_VertexID; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct Varyings + { + float4 PositionCS : POSITION; + float2 TexCoord : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO + }; + + Varyings SharedVertexStage(Attributes input) + { + Varyings output; + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + output.PositionCS = GetFullScreenTriangleVertexPosition(input.VertexID); + output.TexCoord = GetFullScreenTriangleTexCoord(input.VertexID); + + return output; + } + + ENDHLSL + + Pass + { + Name "Copy Color Buffer" + + Cull Off + ZWrite Off + + HLSLPROGRAM + + #pragma vertex SharedVertexStage + #pragma fragment FragmentStage + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl" + #include "../../Headers/HMain.hlsl" + + float4 FragmentStage(Varyings input) : SV_Target + { + return float4(HBUFFER_COLOR(input.TexCoord * _ScreenSize.xy).xyz, 1); + } + + ENDHLSL + } + + Pass + { + Name "Override Indirect Lighting" + + Cull Off + ZWrite Off + + // Doesn't seem to work for the R16G16A16B16 Color Buffer + // Blend One One + // BlendOp RevSub + + HLSLPROGRAM + + #pragma vertex SharedVertexStage + #pragma fragment FragmentStage + + #pragma multi_compile _ PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "../../Headers/HMain.hlsl" + #include "../../Headers/HSpaceTransforms.hlsl" + #include "../../Includes/HFallbackSSGI.hlsl" + + H_TEXTURE(_ColorCopy); + + #define kMaterialFlagSpecularSetup 8 + uint UnpackMaterialFlags(float packedMaterialFlags) + { return uint((packedMaterialFlags * 255.0h) + 0.5h); } + + float4 FragmentStage(Varyings input) : SV_Target + { + uint2 pixCoord = input.TexCoord * _ScreenSize.xy; + float3 ColorCopy = H_LOAD(_ColorCopy, pixCoord).xyz; + + float DepthCenter = HBUFFER_DEPTH(pixCoord); + float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoord); + float3 PositionCenterWS = H_COMPUTE_POSITION_WS(input.TexCoord, DepthCenter, H_MATRIX_I_VP); + + float4 GBuffer0 = H_LOAD(g_HTraceGBuffer0, pixCoord); + float4 Gbuffer1 = H_LOAD(g_HTraceGBuffer1, pixCoord); + + float3 IndirectLighting = 0; + float Metallic = Gbuffer1.r; + + // This seems to make everything worse. + // if ((UnpackMaterialFlags(GBuffer0.a) & kMaterialFlagSpecularSetup) != 0) + // Metallic = (ReflectivitySpecular(Gbuffer1.rgb)); + +#if UNITY_VERSION >= 600000 + if (_EnableProbeVolumes) + { + if (PROBE_VOLUMES_L1 || PROBE_VOLUMES_L2) + { IndirectLighting = EvaluateFallbackAPV(float4(0,0,0,0), PositionCenterWS, NormalCenterWS, H_GET_VIEW_DIRECTION_WS(PositionCenterWS), pixCoord); } + } + else +#endif + { IndirectLighting = EvaluateFallbackSky(NormalCenterWS); } + + // This works reliably only with Render Graph, so we'll use Unity's _ScreenSpaceOcclusionTexture texture directly here + // float SSAO = H_SAMPLE(g_HTraceSSAO, H_SAMPLER_POINT_CLAMP, input.TexCoord); + float SSAO = _AmbientOcclusionParam.x == 0 ? 1 : H_SAMPLE(_ScreenSpaceOcclusionTexture, H_SAMPLER_POINT_CLAMP, input.TexCoord).x; + float AmbientOcclusion = min(SSAO, Gbuffer1.a); + + IndirectLighting = IndirectLighting * GBuffer0.rgb * (1.0 - Metallic) * AmbientOcclusion; + + return float4(max(ColorCopy - IndirectLighting, 0), 1); + } + + ENDHLSL + } + + Pass + { + Name "Final Output" + + Cull Off + ZWrite Off + Blend One One + + HLSLPROGRAM + + #pragma vertex SharedVertexStage + #pragma fragment FragmentStage + + #pragma multi_compile _ PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + #pragma multi_compile _ USE_RECEIVE_LAYER_MASK + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + + #include "../../Headers/HMain.hlsl" + #include "../../Headers/HSpaceTransforms.hlsl" + #include "../../Includes/HFallbackSSGI.hlsl" + + H_TEXTURE(_HTraceBufferGI); + + uint _MetallicIndirectFallback; + uint _ExcludeReceivingLayerMaskSSGI; + float _IndirectLightingIntensity; + float4 _APVParams; + + float4 FragmentStage(Varyings input) : SV_Target + { + uint2 pixCoord = input.TexCoord * _ScreenSize.xy; + + if (HBUFFER_DEPTH(pixCoord) <= 1e-7) return 0; + + float3 IndirectLighting = H_LOAD(_HTraceBufferGI, pixCoord).xyz; + +#if UNITY_VERSION >= 600000 + // Restore indirect lighting on masked out objects + if (USE_RECEIVE_LAYER_MASK) + { + if (HBUFFER_RENDER_LAYER_MASK(input.TexCoord * _ScreenSize.xy) & _ExcludeReceivingLayerMaskSSGI) + { + float3 NormalCenterWS = HBUFFER_NORMAL_WS(pixCoord); + if (_EnableProbeVolumes) + { + float DepthCenter = HBUFFER_DEPTH(pixCoord); + float3 PositionCenterWS = H_COMPUTE_POSITION_WS(input.TexCoord, DepthCenter, H_MATRIX_I_VP); + + if (PROBE_VOLUMES_L1 || PROBE_VOLUMES_L2) + { IndirectLighting = EvaluateFallbackAPV(_APVParams, PositionCenterWS, NormalCenterWS, H_GET_VIEW_DIRECTION_WS(PositionCenterWS), pixCoord); } + } + else + IndirectLighting = EvaluateFallbackSky(NormalCenterWS); + } + } +#endif + float4 GBuffer0 = H_LOAD(g_HTraceGBuffer0, pixCoord); + float4 Gbuffer1 = H_LOAD(g_HTraceGBuffer1, pixCoord); + + // This works reliably only with Render Graph, so we'll use Unity's _ScreenSpaceOcclusionTexture texture directly here + // float SSAO = H_SAMPLE(g_HTraceSSAO, H_SAMPLER_POINT_CLAMP, input.TexCoord); + float SSAO = _AmbientOcclusionParam.x == 0 ? 1 : H_SAMPLE(_ScreenSpaceOcclusionTexture, H_SAMPLER_POINT_CLAMP, input.TexCoord).x; + float AmbientOcclusion = min(SSAO, Gbuffer1.a); + + float Metallic = _MetallicIndirectFallback ? 0 : MetallicFromReflectivity(ReflectivitySpecular(Gbuffer1.rgb)); + + float3 FinalIndirectLighting = IndirectLighting * _IndirectLightingIntensity * GBuffer0.rgb * (1 - Metallic) * AmbientOcclusion; + + return float4(FinalIndirectLighting, 1); + } + + ENDHLSL + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader.meta new file mode 100644 index 0000000..e09e725 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 2a65a40305a962f458eb23b936f45b2c +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/ColorComposeURP.shader + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader new file mode 100644 index 0000000..bc0bd3a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader @@ -0,0 +1,231 @@ +Shader "Hidden/HTraceSSGI/MotionVectorsURP" +{ + SubShader + { + Pass + { + Name "Camera Motion Vectors" + + Cull Off + ZWrite Off + + HLSLPROGRAM + + #pragma vertex VertexStage + #pragma fragment FragmentStage + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include "../../Headers/HMain.hlsl" + + H_TEXTURE(_ObjectMotionVectors); + H_TEXTURE(_ObjectMotionVectorsDepth); + + float _BiasOffset; + + struct Attributes + { + uint VertexID : SV_VertexID; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct Varyings + { + float4 PositionCS : SV_POSITION; + float2 TexCoord : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO + }; + + struct FragOutput + { + float2 MotionVectors : SV_Target0; + float Mask : SV_Target1; + }; + + Varyings VertexStage(Attributes Input) + { + Varyings Output; + UNITY_SETUP_INSTANCE_ID(Input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + Output.PositionCS = GetFullScreenTriangleVertexPosition(Input.VertexID); + Output.TexCoord = GetFullScreenTriangleTexCoord(Input.VertexID); + + return Output; + } + + FragOutput FragmentStage(Varyings Input) + { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + FragOutput Output = (FragOutput)0; + + float2 ObjectMotionVectorsColor = H_LOAD(_ObjectMotionVectors, Input.PositionCS.xy).xy; + float ObjectMotionVectorsDepth = H_LOAD(_ObjectMotionVectorsDepth, Input.PositionCS.xy).x; + float CameraDepth = LoadSceneDepth(Input.PositionCS.xy); + + #if !UNITY_REVERSED_Z + CameraDepth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LoadSceneDepth(Input.PositionCS.xy).x); + #endif + + if (ObjectMotionVectorsDepth >= CameraDepth + _BiasOffset) + { + Output.MotionVectors = ObjectMotionVectorsColor; + Output.Mask = 1; + return Output; + } + + // Reconstruct world position + float3 PositionWS = ComputeWorldSpacePosition(Input.PositionCS.xy * _ScreenSize.zw, CameraDepth, UNITY_MATRIX_I_VP); + + // Multiply with current and previous non-jittered view projection + float4 PositionCS = mul(H_MATRIX_VP, float4(PositionWS.xyz, 1.0)); + float4 PreviousPositionCS = mul(H_MATRIX_PREV_VP, float4(PositionWS.xyz, 1.0)); + + // Non-uniform raster needs to keep the posNDC values in float to avoid additional conversions + // since uv remap functions use floats + float2 PositionNDC = PositionCS.xy * rcp(PositionCS.w); + float2 PreviousPositionNDC = PreviousPositionCS.xy * rcp(PreviousPositionCS.w); + + // Calculate forward velocity + float2 Velocity = (PositionNDC - PreviousPositionNDC); + + // TODO: test that velocity.y is correct + #if UNITY_UV_STARTS_AT_TOP + Velocity.y = -Velocity.y; + #endif + + // Convert velocity from NDC space (-1..1) to screen UV 0..1 space + // Note: It doesn't mean we don't have negative values, we store negative or positive offset in the UV space. + // Note: ((posNDC * 0.5 + 0.5) - (prevPosNDC * 0.5 + 0.5)) = (velocity * 0.5) + Velocity.xy *= 0.5; + + Output.MotionVectors = Velocity; + Output.Mask = 0; + + return Output; + } + + ENDHLSL + } + + + Pass + { + Name "Object Motion Vectors" + + Tags { "LightMode" = "MotionVectors" } + + HLSLPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_instancing + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl" + #include "../../Headers/HMain.hlsl" + + #ifndef HAVE_VFX_MODIFICATION + #pragma multi_compile _ DOTS_INSTANCING_ON + #if UNITY_PLATFORM_ANDROID || UNITY_PLATFORM_WEBGL || UNITY_PLATFORM_UWP + #pragma target 3.5 DOTS_INSTANCING_ON + #else + #pragma target 4.5 DOTS_INSTANCING_ON + #endif + #endif + + struct Attributes + { + float4 Position : POSITION; + float3 PositionOld : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct Varyings + { + float4 PositionCS : SV_POSITION; + float4 PositionCSNoJitter : TEXCOORD0; + float4 PreviousPositionCSNoJitter : TEXCOORD1; + float MotionMask : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + Varyings vert(Attributes Input) + { + UNITY_SETUP_INSTANCE_ID(Input); + Varyings Output = (Varyings)0; + UNITY_TRANSFER_INSTANCE_ID(Input, Output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(Output); + + VertexPositionInputs VertexInput = GetVertexPositionInputs(Input.Position.xyz); + + // Jittered. Match the frame. + Output.PositionCS = VertexInput.positionCS; + + // This is required to avoid artifacts ("gaps" in the _MotionVectorTexture) on some platforms + #if defined(UNITY_REVERSED_Z) + Output.PositionCS.z -= unity_MotionVectorsParams.z * Output.PositionCS.w; + #else + Output.PositionCS.z += unity_MotionVectorsParams.z * Output.PositionCS.w; + #endif + + const float4 PreviousPosition = (unity_MotionVectorsParams.x == 1) ? float4(Input.PositionOld, 1) : Input.Position; + const float4 PositionWS = mul(UNITY_MATRIX_M, Input.Position); + const float4 PreviousPositionWS = mul(UNITY_PREV_MATRIX_M, PreviousPosition); + + Output.PositionCSNoJitter = mul(H_MATRIX_VP, PositionWS); + Output.PreviousPositionCSNoJitter = mul(H_MATRIX_PREV_VP, PreviousPositionWS); + Output.MotionMask = length(PositionWS - PreviousPositionWS) > 0.0001 ? 1 : 0; + + return Output; + } + + struct FragOutput + { + float2 MotionVectors : SV_Target0; + float Mask : SV_Target1; + }; + + FragOutput frag(Varyings Input) + { + UNITY_SETUP_INSTANCE_ID(input); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + FragOutput Output = (FragOutput)0; + + // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled + bool ForceNoMotion = unity_MotionVectorsParams.y == 0.0; + if (ForceNoMotion) + { + Output.MotionVectors = 0; + Output.Mask = 0; + return Output; + } + + // Calculate positions + float4 PositionCS = Input.PositionCSNoJitter; + float4 PreviousPositionCS = Input.PreviousPositionCSNoJitter; + + float2 PositionNDC = PositionCS.xy * rcp(PositionCS.w); + float2 PreviousPositionNDC = PreviousPositionCS.xy * rcp(PreviousPositionCS.w); + + float2 Velocity = (PositionNDC.xy - PreviousPositionNDC.xy); + #if UNITY_UV_STARTS_AT_TOP + Velocity.y = -Velocity.y; + #endif + + // Convert velocity from NDC space (-1..1) to UV 0..1 space + // Note: It doesn't mean we don't have negative values, we store negative or positive offset in UV space. + // Note: ((posNDC * 0.5 + 0.5) - (prevPosNDC * 0.5 + 0.5)) = (velocity * 0.5) + Velocity.xy *= 0.5; + + Output.MotionVectors = Velocity; + Output.Mask = Input.MotionMask; + return Output; + } + ENDHLSL + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader.meta b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader.meta new file mode 100644 index 0000000..c49d4ed --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6f27aac68f194270ad9353a4177fcf0a +timeCreated: 1745943152 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Resources/HTraceSSGI/Shaders/URP/MotionVectorsURP.shader + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene.meta b/Assets/Plugins/HTraceSSGI/Sample Scene.meta new file mode 100644 index 0000000..6a5a71c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4c5d5b37adba1e741b0c5e491ae76235 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset b/Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset new file mode 100644 index 0000000..b3b6784 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset @@ -0,0 +1,65 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4cfa758cbcc84a509b4fbdd3a170a992, type: 3} + m_Name: Default HTrace SSGI Profile + m_EditorClassIdentifier: HTraceSSGI::HTraceSSGI.Scripts.Data.Private.HTraceSSGIProfile + GeneralSettings: + DebugMode: 0 + HBuffer: 0 + Multibounce: 1 + ExcludeCastingMask: + serializedVersion: 0 + m_Bits: 0 + ExcludeReceivingMask: + serializedVersion: 0 + m_Bits: 0 + FallbackType: 0 + _skyIntensity: 0.5 + _viewBias: 0 + _normalBias: 0.33 + _samplingNoise: 0.1 + _intensityMultiplier: 1 + DenoiseFallback: 1 + SSGISettings: + _backfaceLighting: 0 + _maxRayLength: 100 + ThicknessMode: 0 + _thickness: 0.35 + _falloff: 0 + _rayCount: 4 + _stepCount: 32 + RefineIntersection: 1 + FullResolutionDepth: 1 + Checkerboard: 0 + _renderScale: 1 + DenoisingSettings: + BrightnessClamp: 1 + _maxValueBrightnessClamp: 12 + _maxDeviationBrightnessClamp: 2 + HalfStepValidation: 0 + SpatialOcclusionValidation: 1 + TemporalLightingValidation: 1 + TemporalOcclusionValidation: 1 + _spatialRadius: 0.6 + _adaptivity: 0.9 + RecurrentBlur: 0 + FireflySuppression: 1 + DebugSettings: + ShowBowels: 0 + ShowFullDebugLog: 0 + HInjectionPoint: 1 + HTraceLayer: + serializedVersion: 2 + m_Bits: 4294967295 + TestCheckBox1: 0 + TestCheckBox2: 0 + TestCheckBox3: 0 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset.meta new file mode 100644 index 0000000..dd9416b --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 4b20d84daa4c7da478a5f7a10fead959 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Sample Scene/Default HTrace SSGI Profile.asset + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP.meta new file mode 100644 index 0000000..f7a15c3 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d6cfd446d4b049a4b848d41d5fef1fb3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset new file mode 100644 index 0000000..2774ea7 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset @@ -0,0 +1,1024 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-5470913452283579750 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 0 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 0 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 0 + AmbientOverride: + m_OverrideState: 1 + m_Value: 0 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 0.5 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 0 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.4 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 3 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.9 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: HTrace SSGI Sample Scene URP Volume Profile + m_EditorClassIdentifier: + components: + - {fileID: 9108082675869322749} + - {fileID: 7058305194296896203} + - {fileID: 6804410375353511003} +--- !u!114 &184643366705782357 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 0 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 0 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 0 + AmbientOverride: + m_OverrideState: 1 + m_Value: 0 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 0.5 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 0 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.4 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 4 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.9 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &1174947720324204672 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 0 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 4 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 0 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 0 + AmbientOverride: + m_OverrideState: 1 + m_Value: 1 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 0.5 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 1 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.35 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 0 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 30 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 5 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 0 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 0 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.9 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &2426405236594000685 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 0 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 0 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 1 + AmbientOverride: + m_OverrideState: 1 + m_Value: 1 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 0.5 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 1 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.4 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 3 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.9 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &5672950372258795113 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 1 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 8 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 0 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 1 + AmbientOverride: + m_OverrideState: 1 + m_Value: 1 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 0.5 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 1 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.4 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 3 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.86 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &6804410375353511003 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 0 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 0 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 1 + AmbientOverride: + m_OverrideState: 1 + m_Value: 1 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 0.5 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 1 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.4 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 1 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 3 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.9 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &7058305194296896203 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f335fb1ffd8684294ad653bf1c7564, type: 3} + m_Name: ColorAdjustments + m_EditorClassIdentifier: + active: 1 + postExposure: + m_OverrideState: 1 + m_Value: 1 + contrast: + m_OverrideState: 1 + m_Value: 5 + colorFilter: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + hueShift: + m_OverrideState: 0 + m_Value: 0 + saturation: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &7310906143425567460 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f17acff6deb4f089d110375635d4e37, type: 3} + m_Name: HTraceSSGIVolume + m_EditorClassIdentifier: + active: 1 + Enable: + m_OverrideState: 1 + m_Value: 1 + DebugMode: + m_OverrideState: 1 + m_Value: 0 + HBuffer: + m_OverrideState: 1 + m_Value: 0 + ExcludeCastingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + ExcludeReceivingMask: + m_OverrideState: 1 + m_Value: + serializedVersion: 0 + m_Bits: 0 + FallbackType: + m_OverrideState: 1 + m_Value: 1 + MetallicIndirectFallback: + m_OverrideState: 1 + m_Value: 1 + AmbientOverride: + m_OverrideState: 1 + m_Value: 1 + Multibounce: + m_OverrideState: 1 + m_Value: 1 + SkyIntensity: + m_OverrideState: 1 + m_Value: 1 + ViewBias: + m_OverrideState: 1 + m_Value: 0.1 + NormalBias: + m_OverrideState: 1 + m_Value: 0.25 + SamplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + IntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + DenoiseFallback: + m_OverrideState: 1 + m_Value: 1 + BackfaceLighting: + m_OverrideState: 0 + m_Value: 0 + MaxRayLength: + m_OverrideState: 1 + m_Value: 100 + ThicknessMode: + m_OverrideState: 1 + m_Value: 0 + Thickness: + m_OverrideState: 1 + m_Value: 0.4 + Intensity: + m_OverrideState: 1 + m_Value: 1 + Falloff: + m_OverrideState: 1 + m_Value: 0 + RayCount: + m_OverrideState: 1 + m_Value: 4 + StepCount: + m_OverrideState: 1 + m_Value: 32 + RefineIntersection: + m_OverrideState: 1 + m_Value: 1 + FullResolutionDepth: + m_OverrideState: 1 + m_Value: 1 + Checkerboard: + m_OverrideState: 1 + m_Value: 0 + RenderScale: + m_OverrideState: 1 + m_Value: 1 + BrightnessClamp: + m_OverrideState: 1 + m_Value: 0 + MaxValueBrightnessClamp: + m_OverrideState: 1 + m_Value: 2 + MaxDeviationBrightnessClamp: + m_OverrideState: 1 + m_Value: 3 + HalfStepValidation: + m_OverrideState: 1 + m_Value: 0 + SpatialOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalLightingValidation: + m_OverrideState: 1 + m_Value: 1 + TemporalOcclusionValidation: + m_OverrideState: 1 + m_Value: 1 + SpatialRadius: + m_OverrideState: 1 + m_Value: 0.6 + Adaptivity: + m_OverrideState: 1 + m_Value: 0.9 + RecurrentBlur: + m_OverrideState: 1 + m_Value: 0 + FireflySuppression: + m_OverrideState: 1 + m_Value: 1 + ShowBowels: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &9108082675869322749 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 2 + neutralHDRRangeReductionMode: + m_OverrideState: 0 + m_Value: 2 + acesPreset: + m_OverrideState: 0 + m_Value: 3 + hueShiftAmount: + m_OverrideState: 0 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 0 + m_Value: 0 + paperWhite: + m_OverrideState: 0 + m_Value: 300 + detectBrightnessLimits: + m_OverrideState: 0 + m_Value: 1 + minNits: + m_OverrideState: 0 + m_Value: 0.005 + maxNits: + m_OverrideState: 0 + m_Value: 1000 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset.meta new file mode 100644 index 0000000..6142958 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP Volume Profile.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 2b7b1942fa57e1a4cbcff6ea0d7d65f8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample + Scene URP Volume Profile.asset + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity new file mode 100644 index 0000000..a8f3fa4 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity @@ -0,0 +1,1359 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0, g: 0, b: 0, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 112000000, guid: 366e5d9a3e206e041aa009d54e997a87, type: 2} + m_LightingSettings: {fileID: 4890085278179872738, guid: 590535ecc0f15f14199f779f7aa4c507, type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &196438145 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 196438146} + - component: {fileID: 196438149} + - component: {fileID: 196438148} + - component: {fileID: 196438147} + m_Layer: 0 + m_Name: Back Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &196438146 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196438145} + serializedVersion: 2 + m_LocalRotation: {x: -0.49999973, y: 0.5000002, z: -0.50000024, w: 0.49999988} + m_LocalPosition: {x: -0.0143, y: 0.2082, z: 1.06} + m_LocalScale: {x: 2.9590182, y: 0.1, z: 2.9688} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: -90} +--- !u!65 &196438147 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196438145} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &196438148 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196438145} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d9153fcff3f6ea841adaf48d8126e8ef, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &196438149 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196438145} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &280668584 +GameObject: + m_ObjectHideFlags: 19 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 280668586} + - component: {fileID: 280668585} + m_Layer: 0 + m_Name: SceneIDMap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &280668585 +MonoBehaviour: + m_ObjectHideFlags: 19 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 280668584} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 370450657} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &280668586 +Transform: + m_ObjectHideFlags: 19 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 280668584} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &343207155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 343207156} + - component: {fileID: 343207159} + - component: {fileID: 343207158} + - component: {fileID: 343207157} + m_Layer: 0 + m_Name: Big Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &343207156 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343207155} + serializedVersion: 2 + m_LocalRotation: {x: -0.68109804, y: -0.19001414, z: -0.19001412, w: 0.6810982} + m_LocalPosition: {x: -0.51, y: -0.39, z: -0.17919587} + m_LocalScale: {x: 0.7518184, y: 0.6488982, z: 1.4962934} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: -31.176} +--- !u!65 &343207157 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343207155} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &343207158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343207155} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d9153fcff3f6ea841adaf48d8126e8ef, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &343207159 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343207155} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!115 &370450657 +MonoScript: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 7 + m_DefaultReferences: {} + m_Icon: {fileID: 0} + m_Type: 2 + m_ExecutionOrder: 0 + m_ClassName: SceneObjectIDMapSceneAsset + m_Namespace: UnityEngine.Rendering.HighDefinition + m_AssemblyName: +--- !u!1 &661537973 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 661537974} + - component: {fileID: 661537977} + - component: {fileID: 661537976} + - component: {fileID: 661537975} + m_Layer: 0 + m_Name: Ceiling + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &661537974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 661537973} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.0121, y: 1.622, z: -0.3051} + m_LocalScale: {x: 2.982305, y: 0.1, z: 2.8895998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &661537975 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 661537973} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &661537976 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 661537973} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d9153fcff3f6ea841adaf48d8126e8ef, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &661537977 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 661537973} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &673803001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 673803002} + - component: {fileID: 673803005} + - component: {fileID: 673803004} + - component: {fileID: 673803003} + m_Layer: 0 + m_Name: Floor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &673803002 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 673803001} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.0121, y: -1.188, z: -0.3168} + m_LocalScale: {x: 2.982305, y: 0.1, z: 2.913137} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &673803003 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 673803001} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &673803004 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 673803001} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d9153fcff3f6ea841adaf48d8126e8ef, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &673803005 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 673803001} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1071973031 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1071973033} + - component: {fileID: 1071973032} + m_Layer: 0 + m_Name: HTrace Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1071973032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071973031} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: 2b7b1942fa57e1a4cbcff6ea0d7d65f8, type: 2} +--- !u!4 &1071973033 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071973031} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 1.2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1380110273 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1380110274} + m_Layer: 0 + m_Name: Geometry + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1380110274 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380110273} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.03529141, y: 1.080143, z: 0.30615434} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1736322565} + - {fileID: 661537974} + - {fileID: 673803002} + - {fileID: 1580325724} + - {fileID: 196438146} + - {fileID: 343207156} + - {fileID: 1564718288} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1564718287 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1564718288} + - component: {fileID: 1564718291} + - component: {fileID: 1564718290} + - component: {fileID: 1564718289} + m_Layer: 0 + m_Name: Small Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1564718288 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564718287} + serializedVersion: 2 + m_LocalRotation: {x: -0.60084724, y: -0.37280366, z: -0.3728037, w: 0.6008473} + m_LocalPosition: {x: 0.49, y: -0.779, z: -0.735} + m_LocalScale: {x: 0.6090482, y: 0.6488983, z: 0.7201619} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: -63.636} +--- !u!65 &1564718289 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564718287} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1564718290 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564718287} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d9153fcff3f6ea841adaf48d8126e8ef, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1564718291 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564718287} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1580325723 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1580325724} + - component: {fileID: 1580325727} + - component: {fileID: 1580325726} + - component: {fileID: 1580325725} + m_Layer: 0 + m_Name: Green Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1580325724 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580325723} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0.70710707, w: 0.70710653} + m_LocalPosition: {x: 1.45, y: 0.2171, z: -0.30615434} + m_LocalScale: {x: 2.9659188, y: 0.1, z: 3} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} +--- !u!65 &1580325725 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580325723} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1580325726 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580325723} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 425ea38ed8bedfa4aacf6f733eb2282d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1580325727 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580325723} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1684564753 +GameObject: + m_ObjectHideFlags: 19 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1684564755} + - component: {fileID: 1684564754} + m_Layer: 0 + m_Name: SceneIDMap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1684564754 +MonoBehaviour: + m_ObjectHideFlags: 19 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1684564753} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 2102043654} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1684564755 +Transform: + m_ObjectHideFlags: 19 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1684564753} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1736322564 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1736322565} + - component: {fileID: 1736322568} + - component: {fileID: 1736322567} + - component: {fileID: 1736322566} + m_Layer: 0 + m_Name: Red Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1736322565 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1736322564} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0.70710707, w: 0.70710653} + m_LocalPosition: {x: -1.47, y: 0.2152, z: -0.30615434} + m_LocalScale: {x: 2.9659188, y: 0.1, z: 3} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380110274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} +--- !u!65 &1736322566 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1736322564} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1736322567 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1736322564} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 67fcf4336f6079b499741f9409bb9602, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1736322568 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1736322564} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1952662268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1952662271} + - component: {fileID: 1952662273} + - component: {fileID: 1952662272} + m_Layer: 0 + m_Name: Spot Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1952662271 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952662268} + serializedVersion: 2 + m_LocalRotation: {x: 0.6427876, y: 0, z: 0, w: 0.7660445} + m_LocalPosition: {x: 0.03, y: 2.5, z: -0.819} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 80, y: 0, z: 0} +--- !u!114 &1952662272 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952662268} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 0 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 3 +--- !u!108 &1952662273 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952662268} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 2.5 + m_Range: 10 + m_SpotAngle: 165 + m_InnerSpotAngle: 129.99837 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.01 + m_NormalBias: 0.1 + m_NearPlane: 0.1 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!1 &2028365469 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2028365473} + - component: {fileID: 2028365478} + - component: {fileID: 2028365477} + - component: {fileID: 2028365479} + m_Layer: 0 + m_Name: Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2028365473 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2028365469} + serializedVersion: 2 + m_LocalRotation: {x: 0.012827826, y: 0, z: 0, w: 0.99991775} + m_LocalPosition: {x: 0, y: 1.4, z: -4.15} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 1.47, y: 0, z: 0} +--- !u!114 &2028365477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2028365469} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 1 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 +--- !u!20 &2028365478 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2028365469} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.14716971, g: 0.14716971, b: 0.14716971, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!114 &2028365479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2028365469} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 618b0e3f6c65dd247a4a016150006c57, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LookSpeedController: 80 + m_LookSpeedMouse: 2 + m_MoveSpeed: 5 + m_MoveSpeedIncrement: 1.8 + m_Turbo: 8 +--- !u!115 &2102043654 +MonoScript: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 7 + m_DefaultReferences: {} + m_Icon: {fileID: 0} + m_Type: 2 + m_ExecutionOrder: 0 + m_ClassName: SceneObjectIDMapSceneAsset + m_Namespace: UnityEngine.Rendering.HighDefinition + m_AssemblyName: +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2028365473} + - {fileID: 1380110274} + - {fileID: 280668586} + - {fileID: 1684564755} + - {fileID: 1952662271} + - {fileID: 1071973033} diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity.meta new file mode 100644 index 0000000..ddcc815 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample Scene URP.unity.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: a2578560f514a8a488c151ed7db841fb +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/HTrace SSGI Sample + Scene URP.unity + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat new file mode 100644 index 0000000..cc865fa --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat @@ -0,0 +1,356 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Material Green + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - TransparentDepthPrepass + - TransparentDepthPostpass + - TransparentBackface + - RayTracingPrepass + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AnisotropyMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BentNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BentNormalMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _CoatMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissiveColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _HeightMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _IridescenceMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _IridescenceThicknessMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecularColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SubsurfaceMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TangentMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TangentMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ThicknessMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TransmissionMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TransmittanceColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AORemapMax: 1 + - _AORemapMin: 0 + - _ATDistance: 1 + - _AddPrecomputedVelocity: 0 + - _AlbedoAffectEmissive: 0 + - _AlphaClip: 0 + - _AlphaCutoff: 0.5 + - _AlphaCutoffEnable: 0 + - _AlphaCutoffPostpass: 0.5 + - _AlphaCutoffPrepass: 0.5 + - _AlphaCutoffShadow: 0.5 + - _AlphaDstBlend: 0 + - _AlphaRemapMax: 1 + - _AlphaRemapMin: 0 + - _AlphaSrcBlend: 1 + - _AlphaToMask: 0 + - _Anisotropy: 0 + - _Blend: 0 + - _BlendMode: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _CoatMask: 0 + - _Cull: 2 + - _CullMode: 2 + - _CullModeForward: 2 + - _Cutoff: 0.5 + - _DepthOffsetEnable: 0 + - _DetailAlbedoMapScale: 1 + - _DetailAlbedoScale: 1 + - _DetailNormalMapScale: 1 + - _DetailNormalScale: 1 + - _DetailSmoothnessScale: 1 + - _DiffusionProfile: 0 + - _DiffusionProfileHash: 0 + - _DisplacementLockObjectScale: 1 + - _DisplacementLockTilingScale: 1 + - _DisplacementMode: 0 + - _DoubleSidedEnable: 0 + - _DoubleSidedGIMode: 0 + - _DoubleSidedNormalMode: 1 + - _DstBlend: 0 + - _DstBlend2: 0 + - _DstBlendAlpha: 0 + - _EmissiveColorMode: 1 + - _EmissiveExposureWeight: 1 + - _EmissiveIntensity: 1 + - _EmissiveIntensityUnit: 0 + - _EnableBlendModePreserveSpecularLighting: 1 + - _EnableFogOnTransparent: 1 + - _EnableGeometricSpecularAA: 0 + - _EnergyConservingSpecularColor: 1 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _HeightAmplitude: 0.02 + - _HeightCenter: 0.5 + - _HeightMapParametrization: 0 + - _HeightMax: 1 + - _HeightMin: -1 + - _HeightOffset: 0 + - _HeightPoMAmplitude: 2 + - _HeightTessAmplitude: 2 + - _HeightTessCenter: 0.5 + - _InvTilingScale: 1 + - _Ior: 1.5 + - _IridescenceMask: 1 + - _IridescenceThickness: 1 + - _LinkDetailsWithBase: 1 + - _MaterialID: 1 + - _Metallic: 0 + - _MetallicRemapMax: 1 + - _MetallicRemapMin: 0 + - _NormalMapSpace: 0 + - _NormalScale: 1 + - _ObjectSpaceUVMapping: 0 + - _ObjectSpaceUVMappingEmissive: 0 + - _OcclusionStrength: 1 + - _OpaqueCullMode: 2 + - _PPDLodThreshold: 5 + - _PPDMaxSamples: 15 + - _PPDMinSamples: 5 + - _PPDPrimitiveLength: 1 + - _PPDPrimitiveWidth: 1 + - _Parallax: 0.005 + - _PerPixelSorting: 0 + - _QueueOffset: 0 + - _RayTracing: 0 + - _ReceiveShadows: 1 + - _ReceivesSSR: 1 + - _ReceivesSSRTransparent: 0 + - _RefractionModel: 0 + - _Smoothness: 0 + - _SmoothnessRemapMax: 1 + - _SmoothnessRemapMin: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularAAScreenSpaceVariance: 0.1 + - _SpecularAAThreshold: 0.2 + - _SpecularHighlights: 1 + - _SpecularOcclusionMode: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _StencilRef: 0 + - _StencilRefDepth: 8 + - _StencilRefGBuffer: 10 + - _StencilRefMV: 40 + - _StencilWriteMask: 6 + - _StencilWriteMaskDepth: 9 + - _StencilWriteMaskGBuffer: 15 + - _StencilWriteMaskMV: 41 + - _SubsurfaceMask: 1 + - _SupportDecals: 1 + - _Surface: 0 + - _SurfaceType: 0 + - _TexWorldScale: 1 + - _TexWorldScaleEmissive: 1 + - _Thickness: 1 + - _TransmissionEnable: 1 + - _TransmissionMask: 1 + - _TransparentBackfaceEnable: 0 + - _TransparentCullMode: 2 + - _TransparentDepthPostpassEnable: 0 + - _TransparentDepthPrepassEnable: 0 + - _TransparentSortPriority: 0 + - _TransparentWritingMotionVec: 0 + - _TransparentZWrite: 0 + - _UVBase: 0 + - _UVDetail: 0 + - _UVEmissive: 0 + - _UseEmissiveIntensity: 0 + - _UseShadowThreshold: 0 + - _WorkflowMode: 1 + - _ZTestDepthEqualForOpaque: 3 + - _ZTestGBuffer: 4 + - _ZTestTransparent: 4 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0, g: 1, b: 0, a: 1} + - _BaseColorMap_MipInfo: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 0, g: 1, b: 0, a: 1} + - _DiffusionProfileAsset: {r: 0, g: 0, b: 0, a: 0} + - _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} + - _EmissiveColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissiveColorLDR: {r: 0, g: 0, b: 0, a: 1} + - _InvPrimScale: {r: 1, g: 1, b: 0, a: 0} + - _IridescenceThicknessRemap: {r: 0, g: 1, b: 0, a: 0} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _ThicknessRemap: {r: 0, g: 1, b: 0, a: 0} + - _TransmittanceColor: {r: 1, g: 1, b: 1, a: 1} + - _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0} + - _UVMappingMask: {r: 1, g: 0, b: 0, a: 0} + - _UVMappingMaskEmissive: {r: 1, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &1339670755895587704 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 10 +--- !u!114 &7733451441409226090 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 13 + hdPluginSubTargetMaterialVersions: + m_Keys: [] + m_Values: diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat.meta new file mode 100644 index 0000000..f25b020 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 425ea38ed8bedfa4aacf6f733eb2282d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Green.mat + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat new file mode 100644 index 0000000..b8a7eb4 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat @@ -0,0 +1,356 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Material Red + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - TransparentDepthPrepass + - TransparentDepthPostpass + - TransparentBackface + - RayTracingPrepass + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AnisotropyMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BentNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BentNormalMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _CoatMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissiveColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _HeightMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _IridescenceMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _IridescenceThicknessMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecularColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SubsurfaceMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TangentMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TangentMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ThicknessMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TransmissionMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TransmittanceColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AORemapMax: 1 + - _AORemapMin: 0 + - _ATDistance: 1 + - _AddPrecomputedVelocity: 0 + - _AlbedoAffectEmissive: 0 + - _AlphaClip: 0 + - _AlphaCutoff: 0.5 + - _AlphaCutoffEnable: 0 + - _AlphaCutoffPostpass: 0.5 + - _AlphaCutoffPrepass: 0.5 + - _AlphaCutoffShadow: 0.5 + - _AlphaDstBlend: 0 + - _AlphaRemapMax: 1 + - _AlphaRemapMin: 0 + - _AlphaSrcBlend: 1 + - _AlphaToMask: 0 + - _Anisotropy: 0 + - _Blend: 0 + - _BlendMode: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _CoatMask: 0 + - _Cull: 2 + - _CullMode: 2 + - _CullModeForward: 2 + - _Cutoff: 0.5 + - _DepthOffsetEnable: 0 + - _DetailAlbedoMapScale: 1 + - _DetailAlbedoScale: 1 + - _DetailNormalMapScale: 1 + - _DetailNormalScale: 1 + - _DetailSmoothnessScale: 1 + - _DiffusionProfile: 0 + - _DiffusionProfileHash: 0 + - _DisplacementLockObjectScale: 1 + - _DisplacementLockTilingScale: 1 + - _DisplacementMode: 0 + - _DoubleSidedEnable: 0 + - _DoubleSidedGIMode: 0 + - _DoubleSidedNormalMode: 1 + - _DstBlend: 0 + - _DstBlend2: 0 + - _DstBlendAlpha: 0 + - _EmissiveColorMode: 1 + - _EmissiveExposureWeight: 1 + - _EmissiveIntensity: 1 + - _EmissiveIntensityUnit: 0 + - _EnableBlendModePreserveSpecularLighting: 1 + - _EnableFogOnTransparent: 1 + - _EnableGeometricSpecularAA: 0 + - _EnergyConservingSpecularColor: 1 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _HeightAmplitude: 0.02 + - _HeightCenter: 0.5 + - _HeightMapParametrization: 0 + - _HeightMax: 1 + - _HeightMin: -1 + - _HeightOffset: 0 + - _HeightPoMAmplitude: 2 + - _HeightTessAmplitude: 2 + - _HeightTessCenter: 0.5 + - _InvTilingScale: 1 + - _Ior: 1.5 + - _IridescenceMask: 1 + - _IridescenceThickness: 1 + - _LinkDetailsWithBase: 1 + - _MaterialID: 1 + - _Metallic: 0 + - _MetallicRemapMax: 1 + - _MetallicRemapMin: 0 + - _NormalMapSpace: 0 + - _NormalScale: 1 + - _ObjectSpaceUVMapping: 0 + - _ObjectSpaceUVMappingEmissive: 0 + - _OcclusionStrength: 1 + - _OpaqueCullMode: 2 + - _PPDLodThreshold: 5 + - _PPDMaxSamples: 15 + - _PPDMinSamples: 5 + - _PPDPrimitiveLength: 1 + - _PPDPrimitiveWidth: 1 + - _Parallax: 0.005 + - _PerPixelSorting: 0 + - _QueueOffset: 0 + - _RayTracing: 0 + - _ReceiveShadows: 1 + - _ReceivesSSR: 1 + - _ReceivesSSRTransparent: 0 + - _RefractionModel: 0 + - _Smoothness: 0 + - _SmoothnessRemapMax: 1 + - _SmoothnessRemapMin: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularAAScreenSpaceVariance: 0.1 + - _SpecularAAThreshold: 0.2 + - _SpecularHighlights: 1 + - _SpecularOcclusionMode: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _StencilRef: 0 + - _StencilRefDepth: 8 + - _StencilRefGBuffer: 10 + - _StencilRefMV: 40 + - _StencilWriteMask: 6 + - _StencilWriteMaskDepth: 9 + - _StencilWriteMaskGBuffer: 15 + - _StencilWriteMaskMV: 41 + - _SubsurfaceMask: 1 + - _SupportDecals: 1 + - _Surface: 0 + - _SurfaceType: 0 + - _TexWorldScale: 1 + - _TexWorldScaleEmissive: 1 + - _Thickness: 1 + - _TransmissionEnable: 1 + - _TransmissionMask: 1 + - _TransparentBackfaceEnable: 0 + - _TransparentCullMode: 2 + - _TransparentDepthPostpassEnable: 0 + - _TransparentDepthPrepassEnable: 0 + - _TransparentSortPriority: 0 + - _TransparentWritingMotionVec: 0 + - _TransparentZWrite: 0 + - _UVBase: 0 + - _UVDetail: 0 + - _UVEmissive: 0 + - _UseEmissiveIntensity: 0 + - _UseShadowThreshold: 0 + - _WorkflowMode: 1 + - _ZTestDepthEqualForOpaque: 3 + - _ZTestGBuffer: 4 + - _ZTestTransparent: 4 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 0.05042496, b: 0, a: 1} + - _BaseColorMap_MipInfo: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 0.050424933, b: 0, a: 1} + - _DiffusionProfileAsset: {r: 0, g: 0, b: 0, a: 0} + - _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} + - _EmissiveColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissiveColorLDR: {r: 0, g: 0, b: 0, a: 1} + - _InvPrimScale: {r: 1, g: 1, b: 0, a: 0} + - _IridescenceThicknessRemap: {r: 0, g: 1, b: 0, a: 0} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _ThicknessRemap: {r: 0, g: 1, b: 0, a: 0} + - _TransmittanceColor: {r: 1, g: 1, b: 1, a: 1} + - _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0} + - _UVMappingMask: {r: 1, g: 0, b: 0, a: 0} + - _UVMappingMaskEmissive: {r: 1, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &276577487753328058 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 13 + hdPluginSubTargetMaterialVersions: + m_Keys: [] + m_Values: +--- !u!114 &4019547435452770196 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 10 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat.meta new file mode 100644 index 0000000..99889d5 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 67fcf4336f6079b499741f9409bb9602 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material Red.mat + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat new file mode 100644 index 0000000..b29b4af --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat @@ -0,0 +1,358 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-3222236429044804832 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 13 + hdPluginSubTargetMaterialVersions: + m_Keys: [] + m_Values: +--- !u!114 &-2805634088877745809 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Material White + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + - TransparentDepthPrepass + - TransparentDepthPostpass + - TransparentBackface + - RayTracingPrepass + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AnisotropyMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BentNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BentNormalMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _CoatMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissiveColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _HeightMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _IridescenceMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _IridescenceThicknessMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecularColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SubsurfaceMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TangentMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TangentMapOS: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ThicknessMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TransmissionMaskMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TransmittanceColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AORemapMax: 1 + - _AORemapMin: 0 + - _ATDistance: 1 + - _AddPrecomputedVelocity: 0 + - _AlbedoAffectEmissive: 0 + - _AlphaClip: 0 + - _AlphaCutoff: 0.5 + - _AlphaCutoffEnable: 0 + - _AlphaCutoffPostpass: 0.5 + - _AlphaCutoffPrepass: 0.5 + - _AlphaCutoffShadow: 0.5 + - _AlphaDstBlend: 0 + - _AlphaRemapMax: 1 + - _AlphaRemapMin: 0 + - _AlphaSrcBlend: 1 + - _AlphaToMask: 0 + - _Anisotropy: 0 + - _Blend: 0 + - _BlendMode: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _CoatMask: 0 + - _Cull: 2 + - _CullMode: 2 + - _CullModeForward: 2 + - _Cutoff: 0.5 + - _DepthOffsetEnable: 0 + - _DetailAlbedoMapScale: 1 + - _DetailAlbedoScale: 1 + - _DetailNormalMapScale: 1 + - _DetailNormalScale: 1 + - _DetailSmoothnessScale: 1 + - _DiffusionProfile: 0 + - _DiffusionProfileHash: 0 + - _DisplacementLockObjectScale: 1 + - _DisplacementLockTilingScale: 1 + - _DisplacementMode: 0 + - _DoubleSidedEnable: 0 + - _DoubleSidedGIMode: 0 + - _DoubleSidedNormalMode: 1 + - _DstBlend: 0 + - _DstBlend2: 0 + - _DstBlendAlpha: 0 + - _EmissiveColorMode: 1 + - _EmissiveExposureWeight: 1 + - _EmissiveIntensity: 1 + - _EmissiveIntensityUnit: 0 + - _EnableBlendModePreserveSpecularLighting: 1 + - _EnableFogOnTransparent: 1 + - _EnableGeometricSpecularAA: 0 + - _EnergyConservingSpecularColor: 1 + - _EnvironmentReflections: 1 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _HeightAmplitude: 0.02 + - _HeightCenter: 0.5 + - _HeightMapParametrization: 0 + - _HeightMax: 1 + - _HeightMin: -1 + - _HeightOffset: 0 + - _HeightPoMAmplitude: 2 + - _HeightTessAmplitude: 2 + - _HeightTessCenter: 0.5 + - _InvTilingScale: 1 + - _Ior: 1.5 + - _IridescenceMask: 1 + - _IridescenceThickness: 1 + - _LinkDetailsWithBase: 1 + - _MaterialID: 1 + - _Metallic: 0 + - _MetallicRemapMax: 0 + - _MetallicRemapMin: 0 + - _Mode: 0 + - _NormalMapSpace: 0 + - _NormalScale: 1 + - _ObjectSpaceUVMapping: 0 + - _ObjectSpaceUVMappingEmissive: 0 + - _OcclusionStrength: 1 + - _OpaqueCullMode: 2 + - _PPDLodThreshold: 5 + - _PPDMaxSamples: 15 + - _PPDMinSamples: 5 + - _PPDPrimitiveLength: 1 + - _PPDPrimitiveWidth: 1 + - _Parallax: 0.02 + - _PerPixelSorting: 0 + - _QueueOffset: 0 + - _RayTracing: 0 + - _ReceiveShadows: 1 + - _ReceivesSSR: 1 + - _ReceivesSSRTransparent: 0 + - _RefractionModel: 0 + - _Smoothness: 0 + - _SmoothnessRemapMax: 1 + - _SmoothnessRemapMin: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularAAScreenSpaceVariance: 0.1 + - _SpecularAAThreshold: 0.2 + - _SpecularHighlights: 1 + - _SpecularOcclusionMode: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _StencilRef: 0 + - _StencilRefDepth: 8 + - _StencilRefGBuffer: 10 + - _StencilRefMV: 40 + - _StencilWriteMask: 6 + - _StencilWriteMaskDepth: 9 + - _StencilWriteMaskGBuffer: 15 + - _StencilWriteMaskMV: 41 + - _SubsurfaceMask: 1 + - _SupportDecals: 1 + - _Surface: 0 + - _SurfaceType: 0 + - _TexWorldScale: 1 + - _TexWorldScaleEmissive: 1 + - _Thickness: 1 + - _TransmissionEnable: 1 + - _TransmissionMask: 1 + - _TransparentBackfaceEnable: 0 + - _TransparentCullMode: 2 + - _TransparentDepthPostpassEnable: 0 + - _TransparentDepthPrepassEnable: 0 + - _TransparentSortPriority: 0 + - _TransparentWritingMotionVec: 0 + - _TransparentZWrite: 0 + - _UVBase: 0 + - _UVDetail: 0 + - _UVEmissive: 0 + - _UVSec: 0 + - _UseEmissiveIntensity: 0 + - _UseShadowThreshold: 0 + - _WorkflowMode: 1 + - _ZTestDepthEqualForOpaque: 3 + - _ZTestGBuffer: 4 + - _ZTestTransparent: 4 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.9622642, g: 0.9622642, b: 0.9622642, a: 1} + - _BaseColorMap_MipInfo: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 0.9622641, g: 0.9622641, b: 0.9622641, a: 1} + - _DiffusionProfileAsset: {r: 0, g: 0, b: 0, a: 0} + - _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} + - _EmissiveColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissiveColorLDR: {r: 0, g: 0, b: 0, a: 1} + - _InvPrimScale: {r: 1, g: 1, b: 0, a: 0} + - _IridescenceThicknessRemap: {r: 0, g: 1, b: 0, a: 0} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _ThicknessRemap: {r: 0, g: 1, b: 0, a: 0} + - _TransmittanceColor: {r: 1, g: 1, b: 1, a: 1} + - _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0} + - _UVMappingMask: {r: 1, g: 0, b: 0, a: 0} + - _UVMappingMaskEmissive: {r: 1, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat.meta b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat.meta new file mode 100644 index 0000000..72e1be2 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: d9153fcff3f6ea841adaf48d8126e8ef +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Sample Scene/Sample Scene SSGI URP/Material White.mat + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts.meta b/Assets/Plugins/HTraceSSGI/Scripts.meta new file mode 100644 index 0000000..29e9db8 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5699a0ef0e92fc04c8113e890307e4d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data.meta new file mode 100644 index 0000000..34654a2 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1ad0041b45384f34390fd7a858775b12 +timeCreated: 1674799562 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public.meta new file mode 100644 index 0000000..61bfbbb --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d4c715d58c472f42a3bc5699eeeedcb +timeCreated: 1735034400 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs new file mode 100644 index 0000000..e7eb166 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs @@ -0,0 +1,21 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Globals; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Data.Public +{ + [Serializable] + public class DebugSettings + { + public bool ShowBowels = false; + public bool ShowFullDebugLog = false; + public LayerMask HTraceLayer = ~0; + + public bool TestCheckBox1; + public bool TestCheckBox2; + public bool TestCheckBox3; + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs.meta new file mode 100644 index 0000000..683aff7 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5b9df31ca246dfc47be48062d77712a0 +timeCreated: 1734159459 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/DebugSettings.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs new file mode 100644 index 0000000..9827f79 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs @@ -0,0 +1,122 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Data.Public +{ + [Serializable] + public class DenoisingSettings + { + // ----------------------------------------------- DENOISING ----------------------------------------------- + + [SerializeField] + public BrightnessClamp BrightnessClamp = BrightnessClamp.Automatic; + + [SerializeField] + private float _maxValueBrightnessClamp + = 1.0f; + ///

+ /// + /// + /// [1.0;30.0] + [HExtensions.HRangeAttribute(1.0f,30.0f)] + public float MaxValueBrightnessClamp + { + get => _maxValueBrightnessClamp; + set + { + if (Mathf.Abs(value - _maxValueBrightnessClamp) < Mathf.Epsilon) + return; + + _maxValueBrightnessClamp = HExtensions.Clamp(value, typeof(DenoisingSettings), nameof(DenoisingSettings.MaxValueBrightnessClamp)); + } + } + + [SerializeField] + private float _maxDeviationBrightnessClamp + = 3.0f; + + + /// + /// + /// + /// [1.0;5.0] + [HExtensions.HRangeAttribute(1.0f,5.0f)] + public float MaxDeviationBrightnessClamp + { + get => _maxDeviationBrightnessClamp; + set + { + if (Mathf.Abs(value - _maxDeviationBrightnessClamp) < Mathf.Epsilon) + return; + + _maxDeviationBrightnessClamp = HExtensions.Clamp(value, typeof(DenoisingSettings), nameof(DenoisingSettings.MaxDeviationBrightnessClamp)); + } + } + + // ----------------------------------------------- ReSTIR Validation ----------------------------------------------- + + [SerializeField] + public bool HalfStepValidation = false; + + [SerializeField] + public bool SpatialOcclusionValidation = true; + + [SerializeField] + public bool TemporalLightingValidation = true; + + [SerializeField] + public bool TemporalOcclusionValidation = true; + + + // ----------------------------------------------- Spatial ----------------------------------------------- + + [SerializeField] + private float _spatialRadius = 0.6f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float SpatialRadius + { + get => _spatialRadius; + set + { + if (Mathf.Abs(value - _spatialRadius) < Mathf.Epsilon) + return; + + _spatialRadius = HExtensions.Clamp(value, typeof(DenoisingSettings), nameof(DenoisingSettings.SpatialRadius)); + } + } + + [SerializeField] + private float _adaptivity = 0.9f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float Adaptivity + { + get => _adaptivity; + set + { + if (Mathf.Abs(value - _adaptivity) < Mathf.Epsilon) + return; + + _adaptivity = HExtensions.Clamp(value, typeof(DenoisingSettings), nameof(DenoisingSettings.Adaptivity)); + } + } + + [SerializeField] + public bool RecurrentBlur = false; + + [SerializeField] + public bool FireflySuppression = true; + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs.meta new file mode 100644 index 0000000..120bda6 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 360288ad30824b8eaa4113b727ffb011 +timeCreated: 1741602380 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/DenoisingSettings.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs new file mode 100644 index 0000000..0895b44 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs @@ -0,0 +1,129 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Extensions; +using UnityEngine; +using HTraceSSGI.Scripts.Globals; + +namespace HTraceSSGI.Scripts.Data.Public +{ + [Serializable] + public class GeneralSettings + { + public DebugMode DebugMode = DebugMode.None; + public HBuffer HBuffer = HBuffer.Multi; + + [SerializeField] + public bool MetallicIndirectFallback = false; + [SerializeField] + public bool AmbientOverride = true; + + public bool Multibounce = true; + +#if UNITY_2023_3_OR_NEWER + public RenderingLayerMask ExcludeCastingMask = 0; + public RenderingLayerMask ExcludeReceivingMask = 0; +#endif + + [SerializeField] + public FallbackType FallbackType = FallbackType.None; + + [SerializeField] + private float _skyIntensity = 0.5f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float SkyIntensity + { + get => _skyIntensity; + set + { + if (Mathf.Abs(value - _skyIntensity) < Mathf.Epsilon) + return; + + _skyIntensity = HExtensions.Clamp(value, typeof(GeneralSettings), nameof(GeneralSettings.SkyIntensity)); + } + } + + [SerializeField] + private float _viewBias = 0.0f; + /// + /// + /// + /// [0.0;2.0] + [HExtensions.HRangeAttribute(0.0f,2.0f)] + public float ViewBias + { + get => _viewBias; + set + { + if (Mathf.Abs(value - _viewBias) < Mathf.Epsilon) + return; + + _viewBias = HExtensions.Clamp(value, typeof(GeneralSettings), nameof(GeneralSettings.ViewBias)); + } + } + + [SerializeField] + private float _normalBias = 0.33f; + /// + /// + /// + /// [0.0;4.0] + [HExtensions.HRangeAttribute(0.0f,2.0f)] + public float NormalBias + { + get => _normalBias; + set + { + if (Mathf.Abs(value - _normalBias) < Mathf.Epsilon) + return; + + _normalBias = HExtensions.Clamp(value, typeof(GeneralSettings), nameof(GeneralSettings.NormalBias)); + } + } + + [SerializeField] + private float _samplingNoise = 0.1f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float SamplingNoise + { + get => _samplingNoise; + set + { + if (Mathf.Abs(value - _samplingNoise) < Mathf.Epsilon) + return; + + _samplingNoise = HExtensions.Clamp(value, typeof(GeneralSettings), nameof(GeneralSettings.SamplingNoise)); + } + } + + [SerializeField] + private float _intensityMultiplier = 1f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float IntensityMultiplier + { + get => _intensityMultiplier; + set + { + if (Mathf.Abs(value - _intensityMultiplier) < Mathf.Epsilon) + return; + + _intensityMultiplier = HExtensions.Clamp(value, typeof(GeneralSettings), nameof(GeneralSettings.IntensityMultiplier)); + } + } + + public bool DenoiseFallback = true; + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs.meta new file mode 100644 index 0000000..b5af0f6 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4af08f11ccfe6994a994a99e74d35b5f +timeCreated: 1674799588 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/GeneralSettings.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs new file mode 100644 index 0000000..7adc683 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs @@ -0,0 +1,246 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Editor; +using HTraceSSGI.Scripts.Globals; +using UnityEngine; +using UnityEngine.Rendering; +using HTraceSSGI.Scripts.Infrastructure.URP; + +namespace HTraceSSGI.Scripts.Data.Public +{ + internal static class HTraceSSGIPresetData + { + public static void ApplyPresetVolume(HTraceSSGIVolumeEditorURP hTraceSSGIVolumeEditorUrp, HTraceSSGIPreset preset) + { + var stack = VolumeManager.instance.stack; + HTraceSSGIVolume volume = stack?.GetComponent(); + if (volume == null) return; + + HTraceSSGIProfile profile = CreatePresetProfile(HTraceSSGISettings.ActiveProfile, preset); + if (profile == null) return; + + // General Settings + hTraceSSGIVolumeEditorUrp.p_DebugMode.value.enumValueIndex = (int)profile.GeneralSettings.DebugMode; + hTraceSSGIVolumeEditorUrp.p_DebugMode.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_FallbackType.value.enumValueIndex = (int)profile.GeneralSettings.FallbackType; + hTraceSSGIVolumeEditorUrp.p_FallbackType.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_SkyIntensity.value.floatValue = profile.GeneralSettings.SkyIntensity; + hTraceSSGIVolumeEditorUrp.p_SkyIntensity.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_DenoiseFallback.value.boolValue = profile.GeneralSettings.DenoiseFallback; + hTraceSSGIVolumeEditorUrp.p_DenoiseFallback.overrideState.boolValue = true; + + // Visuals + hTraceSSGIVolumeEditorUrp.p_BackfaceLighting.value.floatValue = profile.SSGISettings.BackfaceLighting; + hTraceSSGIVolumeEditorUrp.p_BackfaceLighting.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_MaxRayLength.value.floatValue = profile.SSGISettings.MaxRayLength; + hTraceSSGIVolumeEditorUrp.p_MaxRayLength.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_ThicknessMode.value.enumValueIndex = (int)profile.SSGISettings.ThicknessMode; + hTraceSSGIVolumeEditorUrp.p_ThicknessMode.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_Thickness.value.floatValue = profile.SSGISettings.Thickness; + hTraceSSGIVolumeEditorUrp.p_Thickness.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_Falloff.value.floatValue = profile.SSGISettings.Falloff; + hTraceSSGIVolumeEditorUrp.p_Falloff.overrideState.boolValue = true; + + // Quality - Tracing + hTraceSSGIVolumeEditorUrp.p_RayCount.value.intValue = profile.SSGISettings.RayCount; + hTraceSSGIVolumeEditorUrp.p_RayCount.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_StepCount.value.intValue = profile.SSGISettings.StepCount; + hTraceSSGIVolumeEditorUrp.p_StepCount.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_RefineIntersection.value.boolValue = profile.SSGISettings.RefineIntersection; + hTraceSSGIVolumeEditorUrp.p_RefineIntersection.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_FullResolutionDepth.value.boolValue = profile.SSGISettings.FullResolutionDepth; + hTraceSSGIVolumeEditorUrp.p_FullResolutionDepth.overrideState.boolValue = true; + + // Quality - Rendering + hTraceSSGIVolumeEditorUrp.p_Checkerboard.value.boolValue = profile.SSGISettings.Checkerboard; + hTraceSSGIVolumeEditorUrp.p_Checkerboard.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_RenderScale.value.floatValue = profile.SSGISettings.RenderScale; + hTraceSSGIVolumeEditorUrp.p_RenderScale.overrideState.boolValue = true; + + // Denoising + hTraceSSGIVolumeEditorUrp.p_BrightnessClamp.value.enumValueIndex = (int)profile.DenoisingSettings.BrightnessClamp; + hTraceSSGIVolumeEditorUrp.p_BrightnessClamp.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_MaxValueBrightnessClamp.value.floatValue = profile.DenoisingSettings.MaxValueBrightnessClamp; + hTraceSSGIVolumeEditorUrp.p_MaxValueBrightnessClamp.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_MaxDeviationBrightnessClamp.value.floatValue = profile.DenoisingSettings.MaxDeviationBrightnessClamp; + hTraceSSGIVolumeEditorUrp.p_MaxDeviationBrightnessClamp.overrideState.boolValue = true; + + // Denoising - Temporal Validation + hTraceSSGIVolumeEditorUrp.p_HalfStepValidation.value.boolValue = profile.DenoisingSettings.HalfStepValidation; + hTraceSSGIVolumeEditorUrp.p_HalfStepValidation.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_SpatialOcclusionValidation.value.boolValue = profile.DenoisingSettings.SpatialOcclusionValidation; + hTraceSSGIVolumeEditorUrp.p_SpatialOcclusionValidation.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_TemporalLightingValidation.value.boolValue = profile.DenoisingSettings.TemporalLightingValidation; + hTraceSSGIVolumeEditorUrp.p_TemporalLightingValidation.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_TemporalOcclusionValidation.value.boolValue = profile.DenoisingSettings.TemporalOcclusionValidation; + hTraceSSGIVolumeEditorUrp.p_TemporalOcclusionValidation.overrideState.boolValue = true; + + // Denoising - Spatial Filter + hTraceSSGIVolumeEditorUrp.p_SpatialRadius.value.floatValue = profile.DenoisingSettings.SpatialRadius; + hTraceSSGIVolumeEditorUrp.p_SpatialRadius.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_Adaptivity.value.floatValue = profile.DenoisingSettings.Adaptivity; + hTraceSSGIVolumeEditorUrp.p_Adaptivity.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_RecurrentBlur.value.boolValue = profile.DenoisingSettings.RecurrentBlur; + hTraceSSGIVolumeEditorUrp.p_RecurrentBlur.overrideState.boolValue = true; + + hTraceSSGIVolumeEditorUrp.p_FireflySuppression.value.boolValue = profile.DenoisingSettings.FireflySuppression; + hTraceSSGIVolumeEditorUrp.p_FireflySuppression.overrideState.boolValue = true; + } + + /// + /// Creates a profile from the specified preset type. + /// + public static HTraceSSGIProfile CreatePresetProfile(HTraceSSGIProfile activeProfile, HTraceSSGIPreset preset) + { + switch (preset) + { + case HTraceSSGIPreset.Performance: + return CreatePerformancePreset(activeProfile); + case HTraceSSGIPreset.Optimized: + return CreateOptimizedPreset(activeProfile); + case HTraceSSGIPreset.Balanced: + return CreateBalancedPreset(activeProfile); + case HTraceSSGIPreset.Quality: + return CreateQualityPreset(activeProfile); + default: + return null; + } + } + + public static HTraceSSGIProfile CreatePerformancePreset(HTraceSSGIProfile activeProfile) + { + var profile = Object.Instantiate(activeProfile); + + // Tracing + profile.SSGISettings.RayCount = 2; + profile.SSGISettings.StepCount = 28; + profile.SSGISettings.RefineIntersection = false; + profile.SSGISettings.FullResolutionDepth = false; + + // Rendering + profile.SSGISettings.Checkerboard = true; + profile.SSGISettings.RenderScale = 0.5f; + + // ReSTIR Validation + profile.DenoisingSettings.HalfStepValidation = true; + profile.DenoisingSettings.SpatialOcclusionValidation = true; + profile.DenoisingSettings.TemporalLightingValidation = false; + profile.DenoisingSettings.TemporalOcclusionValidation = false; + + // Spatial Filter + profile.DenoisingSettings.SpatialRadius = 0.65f; + profile.DenoisingSettings.Adaptivity = 0.7f; + profile.DenoisingSettings.RecurrentBlur = true; + profile.DenoisingSettings.FireflySuppression = false; + + return profile; + } + + public static HTraceSSGIProfile CreateOptimizedPreset(HTraceSSGIProfile activeProfile) + { + var profile = Object.Instantiate(activeProfile); + + // Tracing + profile.SSGISettings.RayCount = 3; + profile.SSGISettings.StepCount = 30; + profile.SSGISettings.RefineIntersection = true; + profile.SSGISettings.FullResolutionDepth = false; + + // Rendering + profile.SSGISettings.Checkerboard = true; + profile.SSGISettings.RenderScale = 0.75f; + + // ReSTIR Validation + profile.DenoisingSettings.HalfStepValidation = true; + profile.DenoisingSettings.SpatialOcclusionValidation = true; + profile.DenoisingSettings.TemporalLightingValidation = true; + profile.DenoisingSettings.TemporalOcclusionValidation = true; + + // Spatial Filter + profile.DenoisingSettings.SpatialRadius = 0.6f; + profile.DenoisingSettings.Adaptivity = 0.8f; + profile.DenoisingSettings.RecurrentBlur = true; + profile.DenoisingSettings.FireflySuppression = true; + + return profile; + } + + public static HTraceSSGIProfile CreateBalancedPreset(HTraceSSGIProfile activeProfile) + { + var profile = Object.Instantiate(activeProfile); + + // Tracing + profile.SSGISettings.RayCount = 3; + profile.SSGISettings.StepCount = 32; + profile.SSGISettings.RefineIntersection = true; + profile.SSGISettings.FullResolutionDepth = true; + + // Rendering + profile.SSGISettings.Checkerboard = true; + profile.SSGISettings.RenderScale = 1.0f; + + // ReSTIR Validation + profile.DenoisingSettings.HalfStepValidation = true; + profile.DenoisingSettings.SpatialOcclusionValidation = true; + profile.DenoisingSettings.TemporalLightingValidation = true; + profile.DenoisingSettings.TemporalOcclusionValidation = true; + + // Spatial Filter + profile.DenoisingSettings.SpatialRadius = 0.6f; + profile.DenoisingSettings.Adaptivity = 0.9f; + profile.DenoisingSettings.RecurrentBlur = false; + profile.DenoisingSettings.FireflySuppression = true; + + return profile; + } + + public static HTraceSSGIProfile CreateQualityPreset(HTraceSSGIProfile activeProfile) + { + var profile = Object.Instantiate(activeProfile); + + // Tracing + profile.SSGISettings.RayCount = 4; + profile.SSGISettings.StepCount = 36; + profile.SSGISettings.RefineIntersection = true; + profile.SSGISettings.FullResolutionDepth = true; + + // Rendering + profile.SSGISettings.Checkerboard = false; + profile.SSGISettings.RenderScale = 1.0f; + + // ReSTIR Validation + profile.DenoisingSettings.HalfStepValidation = false; + profile.DenoisingSettings.SpatialOcclusionValidation = true; + profile.DenoisingSettings.TemporalLightingValidation = true; + profile.DenoisingSettings.TemporalOcclusionValidation = true; + + // Spatial Filter + profile.DenoisingSettings.SpatialRadius = 0.6f; + profile.DenoisingSettings.Adaptivity = 0.9f; + profile.DenoisingSettings.RecurrentBlur = false; + profile.DenoisingSettings.FireflySuppression = true; + + return profile; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs.meta new file mode 100644 index 0000000..422f23c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7a3e4f1b8c9d2a5e6f0b1c2d3e4f5a6b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/HTraceSSGIPresetData.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs new file mode 100644 index 0000000..61fb8cc --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs @@ -0,0 +1,91 @@ +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Editor; +using HTraceSSGI.Scripts.Globals; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Data.Private +{ + [CreateAssetMenu(fileName = "HTraceSSGI Profile", menuName = "HTrace/SSGI Profile", order = 251)] + [HelpURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK)] + public class HTraceSSGIProfile : ScriptableObject + { + [SerializeField] + public GeneralSettings GeneralSettings = new GeneralSettings(); + [SerializeField] + public SSGISettings SSGISettings = new SSGISettings(); + [SerializeField] + public DenoisingSettings DenoisingSettings = new DenoisingSettings(); + [SerializeField] + public DebugSettings DebugSettings = new DebugSettings(); + + /// + /// Applies a preset configuration to this profile. + /// This will overwrite all current settings with the preset values. + /// + /// The preset type to apply + public void ApplyPreset(HTraceSSGIPreset preset) + { + var presetProfile = HTraceSSGIPresetData.CreatePresetProfile(this, preset); + if (presetProfile == null) + return; + + // Copy all settings from preset profile + CopySettingsFrom(presetProfile); + } + + /// + /// Copies all settings from another profile to this profile. + /// + /// The profile to copy settings from + public void CopySettingsFrom(HTraceSSGIProfile sourceProfile) + { + if (sourceProfile == null) + return; + + // Copy General Settings + GeneralSettings.DebugMode = sourceProfile.GeneralSettings.DebugMode; + GeneralSettings.HBuffer = sourceProfile.GeneralSettings.HBuffer; + GeneralSettings.MetallicIndirectFallback = sourceProfile.GeneralSettings.MetallicIndirectFallback; + GeneralSettings.AmbientOverride = sourceProfile.GeneralSettings.AmbientOverride; + GeneralSettings.Multibounce = sourceProfile.GeneralSettings.Multibounce; +#if UNITY_2023_3_OR_NEWER + GeneralSettings.ExcludeCastingMask = sourceProfile.GeneralSettings.ExcludeCastingMask; + GeneralSettings.ExcludeReceivingMask = sourceProfile.GeneralSettings.ExcludeReceivingMask; +#endif + GeneralSettings.FallbackType = sourceProfile.GeneralSettings.FallbackType; + GeneralSettings.SkyIntensity = sourceProfile.GeneralSettings.SkyIntensity; + GeneralSettings.ViewBias = sourceProfile.GeneralSettings.ViewBias; + GeneralSettings.NormalBias = sourceProfile.GeneralSettings.NormalBias; + GeneralSettings.SamplingNoise = sourceProfile.GeneralSettings.SamplingNoise; + GeneralSettings.IntensityMultiplier = sourceProfile.GeneralSettings.IntensityMultiplier; + GeneralSettings.DenoiseFallback = sourceProfile.GeneralSettings.DenoiseFallback; + + // Copy SSGI Settings + SSGISettings.BackfaceLighting = sourceProfile.SSGISettings.BackfaceLighting; + SSGISettings.MaxRayLength = sourceProfile.SSGISettings.MaxRayLength; + SSGISettings.ThicknessMode = sourceProfile.SSGISettings.ThicknessMode; + SSGISettings.Thickness = sourceProfile.SSGISettings.Thickness; + SSGISettings.Intensity = sourceProfile.SSGISettings.Intensity; + SSGISettings.Falloff = sourceProfile.SSGISettings.Falloff; + SSGISettings.RayCount = sourceProfile.SSGISettings.RayCount; + SSGISettings.StepCount = sourceProfile.SSGISettings.StepCount; + SSGISettings.RefineIntersection = sourceProfile.SSGISettings.RefineIntersection; + SSGISettings.FullResolutionDepth = sourceProfile.SSGISettings.FullResolutionDepth; + SSGISettings.Checkerboard = sourceProfile.SSGISettings.Checkerboard; + SSGISettings.RenderScale = sourceProfile.SSGISettings.RenderScale; + + // Copy Denoising Settings + DenoisingSettings.BrightnessClamp = sourceProfile.DenoisingSettings.BrightnessClamp; + DenoisingSettings.MaxValueBrightnessClamp = sourceProfile.DenoisingSettings.MaxValueBrightnessClamp; + DenoisingSettings.MaxDeviationBrightnessClamp = sourceProfile.DenoisingSettings.MaxDeviationBrightnessClamp; + DenoisingSettings.HalfStepValidation = sourceProfile.DenoisingSettings.HalfStepValidation; + DenoisingSettings.SpatialOcclusionValidation = sourceProfile.DenoisingSettings.SpatialOcclusionValidation; + DenoisingSettings.TemporalLightingValidation = sourceProfile.DenoisingSettings.TemporalLightingValidation; + DenoisingSettings.TemporalOcclusionValidation = sourceProfile.DenoisingSettings.TemporalOcclusionValidation; + DenoisingSettings.SpatialRadius = sourceProfile.DenoisingSettings.SpatialRadius; + DenoisingSettings.Adaptivity = sourceProfile.DenoisingSettings.Adaptivity; + DenoisingSettings.RecurrentBlur = sourceProfile.DenoisingSettings.RecurrentBlur; + DenoisingSettings.FireflySuppression = sourceProfile.DenoisingSettings.FireflySuppression; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs.meta new file mode 100644 index 0000000..727166d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4cfa758cbcc84a509b4fbdd3a170a992 +timeCreated: 1745928800 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/HTraceSSGIProfile.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs new file mode 100644 index 0000000..03d6092 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs @@ -0,0 +1,29 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Data.Private; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Data.Public +{ + /// + /// Change global HTrace SSGI settings, only for UseVolumes is disabled in HTrace SSGI Renderer Feature + /// + public static class HTraceSSGISettings + { + private static HTraceSSGIProfile _cachedProfile; + + public static HTraceSSGIProfile ActiveProfile + { + get + { + return _cachedProfile; + } + } + + public static void SetProfile(HTraceSSGIProfile profile) + { + _cachedProfile = profile; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs.meta new file mode 100644 index 0000000..da997f9 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d8283f6a3aff4a17b9edd5dfb9349cbe +timeCreated: 1761683456 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/HTraceSSGISettings.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs new file mode 100644 index 0000000..e4981e7 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs @@ -0,0 +1,187 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Data.Public +{ + [Serializable] + public class SSGISettings + { + // ----------------------------------------------- Visuals ----------------------------------------------- + + [SerializeField] + private float _backfaceLighting = 0f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float BackfaceLighting + { + get => _backfaceLighting; + set + { + if (Mathf.Abs(value - _backfaceLighting) < Mathf.Epsilon) + return; + + _backfaceLighting = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.BackfaceLighting)); + } + } + + [SerializeField] + private float _maxRayLength = 100f; + /// + /// + /// + /// [0.0;infinity] + [HExtensions.HRangeAttribute(0.0f,float.MaxValue)] + public float MaxRayLength + { + get => _maxRayLength; + set + { + if (Mathf.Abs(value - _maxRayLength) < Mathf.Epsilon) + return; + + _maxRayLength = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.MaxRayLength)); + } + } + + public ThicknessMode ThicknessMode = ThicknessMode.Relative; + + [SerializeField] + private float _thickness = 0.35f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0.0f,1.0f)] + public float Thickness + { + get => _thickness; + set + { + if (Mathf.Abs(value - _thickness) < Mathf.Epsilon) + return; + + _thickness = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.Thickness)); + } + } + + [SerializeField] + private float _intensity = 1f; + /// + /// + /// + /// [0.1;5.0] + [HExtensions.HRangeAttribute(0.1f,5.0f)] + public float Intensity + { + get => _intensity; + set + { + if (Mathf.Abs(value - _intensity) < Mathf.Epsilon) + return; + + _intensity = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.Intensity)); + } + } + + [SerializeField] + private float _falloff = 0.0f; + /// + /// + /// + /// [0.0;1.0] + [HExtensions.HRangeAttribute(0f,1.0f)] + public float Falloff + { + get => _falloff; + set + { + if (Mathf.Abs(value - _falloff) < Mathf.Epsilon) + return; + + _falloff = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.Falloff)); + } + } + + // ----------------------------------------------- Quality ----------------------------------------------- + // ----------------------------------------------- Tracing ----------------------------------------------- + + [SerializeField] + private int _rayCount = 4; + /// + /// + /// + /// [2;16] + [HExtensions.HRangeAttribute(2,16)] + public int RayCount + { + get + { + return _rayCount; + } + set + { + if (value == _rayCount) + return; + + _rayCount = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.RayCount)); + } + } + + [SerializeField] + private int _stepCount = 32; + /// + /// + /// + /// [8;64] + [HExtensions.HRangeAttribute(8,128)] + public int StepCount + { + get => _stepCount; + set + { + if (value == _stepCount) + return; + + _stepCount = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.StepCount)); + } + } + + [SerializeField] + public bool RefineIntersection = true; + + [SerializeField] + public bool FullResolutionDepth = true; + + // ----------------------------------------------- Rendering ----------------------------------------------- + + [SerializeField] + public bool Checkerboard = false; + + [SerializeField] + private float _renderScale = 1f; + /// + /// + /// + /// [0.5;1.0] + [HExtensions.HRangeAttribute(0.5f,1.0f)] + public float RenderScale + { + get => _renderScale; + set + { + if (Mathf.Abs(value - _renderScale) < Mathf.Epsilon) + return; + + _renderScale = HExtensions.Clamp(value, typeof(SSGISettings), nameof(SSGISettings.RenderScale)); + } + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs.meta new file mode 100644 index 0000000..8024b44 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ae21e1c951f5f51488fabe310b39c1e8 +timeCreated: 1731130646 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Data/Public/SSGISettings.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Default.asset b/Assets/Plugins/HTraceSSGI/Scripts/Default.asset new file mode 100644 index 0000000..15498bc --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Default.asset @@ -0,0 +1,122 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4881f9a2c4d568047b316028d20a8dca, type: 3} + m_Name: Default + m_EditorClassIdentifier: + singleSceneMode: 1 + dialogNoProbeVolumeInSetShown: 0 + settings: + m_Version: 1 + dilationSettings: + enableDilation: 0 + dilationDistance: 0 + dilationValidityThreshold: 0 + dilationIterations: 0 + squaredDistWeighting: 0 + virtualOffsetSettings: + useVirtualOffset: 0 + validityThreshold: 0 + outOfGeoOffset: 0 + searchMultiplier: 0 + rayOriginBias: -0.001 + collisionMask: + serializedVersion: 2 + m_Bits: 4294967291 + m_SceneGUIDs: [] + obsoleteScenesToNotBake: [] + m_LightingScenarios: + - Default + cellDescs: + m_Keys: + m_Values: [] + m_SerializedPerSceneCellList: [] + cellSharedDataAsset: + m_AssetGUID: + m_StreamableAssetPath: + m_ElementSize: 0 + m_StreamableCellDescs: + m_Keys: + m_Values: [] + m_Asset: {fileID: 0} + scenarios: + m_Keys: [] + m_Values: [] + cellBricksDataAsset: + m_AssetGUID: + m_StreamableAssetPath: + m_ElementSize: 0 + m_StreamableCellDescs: + m_Keys: + m_Values: [] + m_Asset: {fileID: 0} + cellSupportDataAsset: + m_AssetGUID: + m_StreamableAssetPath: + m_ElementSize: 0 + m_StreamableCellDescs: + m_Keys: + m_Values: [] + m_Asset: {fileID: 0} + chunkSizeInBricks: 0 + maxCellPosition: {x: 0, y: 0, z: 0} + minCellPosition: {x: 0, y: 0, z: 0} + globalBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + bakedSimplificationLevels: 3 + bakedMinDistanceBetweenProbes: 1 + bakedProbeOcclusion: 0 + bakedSkyOcclusionValue: 0 + bakedSkyShadingDirectionValue: 0 + bakedProbeOffset: {x: 0, y: 0, z: 0} + bakedMaskCount: 1 + bakedLayerMasks: + x: 0 + y: 0 + z: 0 + w: 0 + maxSHChunkCount: -1 + L0ChunkSize: 0 + L1ChunkSize: 0 + L2TextureChunkSize: 0 + ProbeOcclusionChunkSize: 0 + sharedValidityMaskChunkSize: 0 + sharedSkyOcclusionL0L1ChunkSize: 0 + sharedSkyShadingDirectionIndicesChunkSize: 0 + sharedDataChunkSize: 0 + supportPositionChunkSize: 0 + supportValidityChunkSize: 0 + supportTouchupChunkSize: 0 + supportLayerMaskChunkSize: 0 + supportOffsetsChunkSize: 0 + supportDataChunkSize: 0 + lightingScenario: Default + version: 2 + freezePlacement: 0 + probeOffset: {x: 0, y: 0, z: 0} + simplificationLevels: 3 + minDistanceBetweenProbes: 1 + renderersLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + minRendererVolumeSize: 0.1 + skyOcclusion: 0 + skyOcclusionBakingSamples: 2048 + skyOcclusionBakingBounces: 2 + skyOcclusionAverageAlbedo: 0.6 + skyOcclusionBackFaceCulling: 0 + skyOcclusionShadingDirection: 0 + useRenderingLayers: 0 + renderingLayerMasks: [] + m_SceneBakeData: + m_Keys: [] + m_Values: [] diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Default.asset.meta b/Assets/Plugins/HTraceSSGI/Scripts/Default.asset.meta new file mode 100644 index 0000000..e4373dc --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Default.asset.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 3efa5727399f12d458fa48a18a86be8d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Default.asset + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor.meta new file mode 100644 index 0000000..50339c2 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e230c412c545e65479e9662bc63b1d47 +timeCreated: 1674796671 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs new file mode 100644 index 0000000..4ef6d70 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs @@ -0,0 +1,305 @@ +#if UNITY_EDITOR +using System; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Editor +{ + public class HDEditorUtilsWrapper + { + #region Public Methods + + public static bool EnsureFrameSetting(int frameSettingsField) + { + try + { + Type hdEditorUtilsType = GetHDEditorUtilsType(); + if (hdEditorUtilsType == null) + { + return false; + } + + Type frameSettingsFieldType = GetFrameSettingsFieldType(); + if (frameSettingsFieldType == null) + { + return false; + } + + object frameSettingsFieldEnum = Enum.ToObject(frameSettingsFieldType, frameSettingsField); + + MethodInfo ensureFrameSettingMethod = hdEditorUtilsType.GetMethod("EnsureFrameSetting", + BindingFlags.NonPublic | BindingFlags.Static, + null, + new Type[] { frameSettingsFieldType }, + null); + + if (ensureFrameSettingMethod == null) + { + return false; + } + + object result = ensureFrameSettingMethod.Invoke(null, new object[] { frameSettingsFieldEnum }); + return result != null && (bool)result; + } + catch (Exception ex) + { + return false; + } + } + + public static void QualitySettingsHelpBox(string message, MessageType messageType, int expandableGroup, string propertyPath) + { + try + { + Type hdEditorUtilsType = GetHDEditorUtilsType(); + if (hdEditorUtilsType == null) + { + return; + } + + Type messageTypeEnum = typeof(MessageType); + Type expandableGroupType = GetExpandableGroupType(); + + if (expandableGroupType == null) + { + return; + } + + object messageTypeValue = Enum.ToObject(messageTypeEnum, messageType); + object expandableGroupValue = Enum.ToObject(expandableGroupType, expandableGroup); + + MethodInfo qualitySettingsHelpBoxMethod = hdEditorUtilsType.GetMethod("QualitySettingsHelpBox", + BindingFlags.NonPublic | BindingFlags.Static, + null, + new Type[] { typeof(string), messageTypeEnum, expandableGroupType, typeof(string) }, + null); + + if (qualitySettingsHelpBoxMethod == null) + { + return; + } + + qualitySettingsHelpBoxMethod.Invoke(null, new object[] { message, messageTypeValue, expandableGroupValue, propertyPath }); + } + catch (Exception ex) + { + //Debug.LogError($"Error calling HDEditorUtils.QualitySettingsHelpBox: {ex.Message}"); + } + } + + public static void QualitySettingsHelpBoxWithSection(string message, MessageType messageType, int expandableGroup, int expandableSection, string propertyPath) + { + try + { + Type hdEditorUtilsType = GetHDEditorUtilsType(); + if (hdEditorUtilsType == null) + { + Debug.LogError("Failed to find HDEditorUtils type"); + return; + } + + Type messageTypeEnum = typeof(MessageType); + Type expandableGroupType = GetExpandableGroupType(); + + if (expandableGroupType == null) + { + Debug.LogError("Failed to find ExpandableGroup type"); + return; + } + + object messageTypeValue = Enum.ToObject(messageTypeEnum, messageType); + object expandableGroupValue = Enum.ToObject(expandableGroupType, expandableGroup); + + MethodInfo[] methods = hdEditorUtilsType.GetMethods(BindingFlags.NonPublic | BindingFlags.Static); + MethodInfo genericMethod = null; + + foreach (var method in methods) + { + if (method.Name == "QualitySettingsHelpBox" && + method.IsGenericMethodDefinition && + method.GetParameters().Length == 5) + { + genericMethod = method; + break; + } + } + + if (genericMethod == null) + { + Debug.LogError("Failed to find generic QualitySettingsHelpBox method"); + return; + } + + Type expandableLightingType = GetExpandableLightingType(); + if (expandableLightingType == null) + { + expandableLightingType = expandableGroupType; + } + + MethodInfo concreteMethod = genericMethod.MakeGenericMethod(expandableLightingType); + + object expandableSectionValue = Enum.ToObject(expandableLightingType, expandableSection); + + concreteMethod.Invoke(null, new object[] { message, messageTypeValue, expandableGroupValue, expandableSectionValue, propertyPath }); + } + catch (Exception ex) + { + Debug.LogError($"Error calling HDEditorUtils.QualitySettingsHelpBox with section: {ex.Message}"); + } + } + + #endregion + + #region Helper Methods + + private static Type GetHDEditorUtilsType() + { + Type hdEditorUtilsType = Type.GetType("UnityEditor.Rendering.HighDefinition.HDEditorUtils, Unity.RenderPipelines.HighDefinition.Editor"); + + if (hdEditorUtilsType == null) + { + var assemblies = System.AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + hdEditorUtilsType = assembly.GetType("UnityEditor.Rendering.HighDefinition.HDEditorUtils"); + if (hdEditorUtilsType != null) break; + } + } + + return hdEditorUtilsType; + } + + private static Type GetFrameSettingsFieldType() + { + Type frameSettingsFieldType = Type.GetType("UnityEngine.Rendering.HighDefinition.FrameSettingsField, Unity.RenderPipelines.HighDefinition.Runtime"); + + if (frameSettingsFieldType == null) + { + var assemblies = System.AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + frameSettingsFieldType = assembly.GetType("UnityEngine.Rendering.HighDefinition.FrameSettingsField"); + if (frameSettingsFieldType != null) break; + } + } + + return frameSettingsFieldType; + } + + private static Type GetExpandableGroupType() + { + Type hdrpUIType = GetHDRPUIType(); + if (hdrpUIType == null) return null; + + return hdrpUIType.GetNestedType("ExpandableGroup", BindingFlags.NonPublic | BindingFlags.Public); + } + + private static Type GetExpandableLightingType() + { + Type hdrpUIType = GetHDRPUIType(); + if (hdrpUIType == null) return null; + + return hdrpUIType.GetNestedType("ExpandableLighting", BindingFlags.NonPublic | BindingFlags.Public); + } + + private static Type GetHDRPUIType() + { + Type hdrpUIType = Type.GetType("UnityEditor.Rendering.HighDefinition.HDRenderPipelineUI, Unity.RenderPipelines.HighDefinition.Editor"); + + if (hdrpUIType == null) + { + var assemblies = System.AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + hdrpUIType = assembly.GetType("UnityEditor.Rendering.HighDefinition.HDRenderPipelineUI"); + if (hdrpUIType != null) break; + } + } + + return hdrpUIType; + } + + public static int GetFrameSettingsFieldValue(string fieldName) + { + try + { + Type frameSettingsFieldType = GetFrameSettingsFieldType(); + if (frameSettingsFieldType == null) + return -1; + + object enumValue = Enum.Parse(frameSettingsFieldType, fieldName); + return (int)enumValue; + } + catch (Exception ex) + { + Debug.LogError($"Error when get FrameSettingsField.{fieldName}: {ex.Message}"); + return -1; + } + } + + // internal enum ExpandableGroup + // { + // Rendering = 1 << 4, + // Lighting = 1 << 5, + // LightingTiers = 1 << 6, + // Material = 1 << 7, + // PostProcess = 1 << 8, + // PostProcessTiers = 1 << 9, + // XR = 1 << 10, + // VirtualTexturing = 1 << 11, + // Volumes = 1 << 12 + // } + + public static int GetExpandableGroupValue(string groupName) + { + try + { + Type expandableGroupType = GetExpandableGroupType(); + if (expandableGroupType == null) + return -1; + + object enumValue = Enum.Parse(expandableGroupType, groupName); + return (int)enumValue; + } + catch (Exception ex) + { + Debug.LogError($"Error when get ExpandableGroup.{groupName}: {ex.Message}"); + return -1; + } + } + + // internal enum ExpandableLighting + // { + // Volumetric = 1 << 0, + // ProbeVolume = 1 << 1, + // Cookie = 1 << 2, + // Reflection = 1 << 3, + // Sky = 1 << 4, + // // Illegal index 1 << 5 since parent Lighting section index is using it + // LightLoop = 1 << 6, + // Shadow = 1 << 7 + // } + + public static int GetExpandableLightingValue(string lightingName) + { + try + { + Type expandableLightingType = GetExpandableLightingType(); + if (expandableLightingType == null) + return -1; + + object enumValue = Enum.Parse(expandableLightingType, lightingName); + return (int)enumValue; + } + catch (Exception ex) + { + Debug.LogError($"Error when get ExpandableLighting.{lightingName}: {ex.Message}"); + return -1; + } + } + + #endregion + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs.meta new file mode 100644 index 0000000..0f09f0a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d6c5a454614b45b1b4d9c443d62ee70b +timeCreated: 1758542957 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HDEditorUtilsWrapper.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs new file mode 100644 index 0000000..27d3fbb --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs @@ -0,0 +1,133 @@ +#if UNITY_EDITOR +using UnityEditor; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Editor +{ + internal static class HEditorStyles + { + public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + public static float additionalLineSpace = 10f; + public static float helpBoxHeight = EditorGUIUtility.singleLineHeight * 2; + public static float checkBoxOffsetWidth = 15f; + public static float checkBoxWidth = 15f; + public static float tabOffset = 8f; + + // Buttons name + public const string FixButtonName = "Fix"; + public const string ChangeButtonName = "Change"; + public const string OpenButtonName = "Open"; + + // Debug Tab + public static GUIContent DebugContent = new GUIContent("Debug"); + public static GUIContent hTraceLayerContent = new GUIContent("HTrace Layer", "Excludes objects from HTrace rendering on a per-layer basis"); + + // Foldout names + public static GUIContent GlobalSettings = new GUIContent("Global Settings"); + public static GUIContent PipelineIntegration = new GUIContent("Pipeline Integration"); + public static GUIContent Visuals = new GUIContent("Visuals"); + public static GUIContent Quality = new GUIContent("Quality"); + public static GUIContent Tracing = new GUIContent("Tracing"); + public static GUIContent Rendering = new GUIContent("Rendering"); + public static GUIContent Denoising = new GUIContent("Denoising"); + public static GUIContent ReSTIRValidation = new GUIContent("ReSTIR Validation"); + public static GUIContent ValidationTypes = new GUIContent("Validation Types:"); + public static GUIContent SpatialFilter = new GUIContent("Spatial Filter"); + public static GUIContent Debug = new GUIContent("Debug"); + + // General Tab + public static GUIContent DebugModeContent = new GUIContent("Debug Mode", "Visualizes the debug mode for different rendering components of H-Trace."); + public static GUIContent HBuffer = new GUIContent("Buffer", "Visualizes the debug mode for different buffers"); + + // Visuals + public static GUIContent ThicknessMode = new GUIContent("Thickness Mode", "Method for thickness estimation."); + public static GUIContent Thickness = new GUIContent("Thickness", "Virtual object thickness for ray intersections."); + public static GUIContent BackfaceLighting = new GUIContent("Backface Lighting", ""); + public static GUIContent MaxRayLength = new GUIContent("Max Ray Length", "Maximum ray distance in meters."); + public static GUIContent FallbackType = new("Fallback", "Method used when a ray misses."); + public static GUIContent SkyIntensity = new("Sky Intensity", "Brightness of Sky used for ray misses."); + public static GUIContent ExcludeCastingMask = new("Exclude Casting", "Prevents objects from casting GI."); + public static GUIContent ExcludeReceivingMask = new("Exclude Receiving", "Prevents objects from receiving screen-space GI."); + public static GUIContent NormalBias = new("APV Normal Bias"); + public static GUIContent ViewBias = new("APV View Bias"); + public static GUIContent SamplingNoise = new("APV Sampling Noise"); + public static GUIContent DenoiseFallback = new("Denoise Fallback", "Includes fallback lighting in denoising."); + public static GUIContent Intensity = new GUIContent("Intensity"); + public static GUIContent Falloff = new GUIContent("Falloff", "Softens indirect lighting over distance."); + + // Quality tab + // Tracing + public static GUIContent RayCount = new GUIContent("Ray Count", "Number of rays per pixel."); + public static GUIContent StepCount = new GUIContent("Step Count", "Number of steps per ray."); + public static GUIContent RefineIntersection = new GUIContent("Refine Intersection", "Extra check to confirm hits."); + public static GUIContent FullResolutionDepth = new GUIContent("Full Resolution Depth", "Uses full-res depth buffer for tracing."); + + //Rendering + public static GUIContent Checkerboard = new GUIContent("Checkerboard"); + public static GUIContent RenderScale = new GUIContent("Render Scale", "Local render scale of SSGI."); + + // Denoising tab + public static GUIContent BrightnessClamp = new("Brightness Clamp", "Method for clamping brightness at hit point."); + public static GUIContent MaxValueBrightnessClamp = new(" Max Value", "Maximum brightness allowed at hit points."); + public static GUIContent MaxDeviationBrightnessClamp = new(" Max Deviation", "Maximum standard deviation for brightness allowed at hit points."); + + // ReSTIR Validation + public static GUIContent HalfStepValidation = new("Half-Step Tracing", "Halves validation ray steps."); + public static GUIContent SpatialOcclusionValidation = new("Spatial Occlusion", "Preserves detail, reduces leaks during blur."); + public static GUIContent TemporalLightingValidation = new("Temporal Lighting", "Reacts faster to changing lights."); + public static GUIContent TemporalOcclusionValidation = new("Temporal Occlusion", "Reacts faster to moving shadows."); + + // Spatial Fliter + public static GUIContent SpatialRadius = new GUIContent("Radius", "Width of spatial filter."); + public static GUIContent Adaptivity = new GUIContent("Adaptivity", "Shrinks filter radius in geometry corners to preserve detail."); + public static GUIContent RecurrentBlur = new GUIContent("Recurrent Blur", "Stronger blur with low cost, less temporal reactivity."); + public static GUIContent FireflySuppression = new GUIContent("Firefly Suppression", "Removes bright outliers before denoising."); + + public static GUIStyle bold = new GUIStyle() + { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(), + padding = new RectOffset(2, 0, 0, 0), + fontSize = 12, + normal = new GUIStyleState() + { + textColor = new Color(0.903f, 0.903f, 0.903f, 1f), + }, + fontStyle = FontStyle.Bold, + }; + + public static GUIStyle hiddenFoldout = new GUIStyle() + { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(), + padding = new RectOffset(), + fontSize = 12, + normal = new GUIStyleState() + { + //textColor = new Color(0.703f, 0.703f, 0.703f, 1f), //default color + textColor = new Color(0.500f, 0.500f, 0.500f, 1f), + }, + fontStyle = FontStyle.Bold, + }; + + public static GUIStyle headerFoldout = new GUIStyle() + { + alignment = TextAnchor.MiddleLeft, + margin = new RectOffset(), + padding = new RectOffset(), + fontSize = 12, + normal = new GUIStyleState() + { + textColor = new Color(0.903f, 0.903f, 0.903f, 1f), + }, + fontStyle = FontStyle.Bold, + }; + + //buttons gui styles + public static Color warningBackgroundColor = new Color(1,1, 0); + public static Color warningColor = new Color(1, 1, 1); + + public static GUIStyle foldout = EditorStyles.foldout; + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs.meta new file mode 100644 index 0000000..116a521 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorStyles.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7b0103dbde10dd04eb57da14de01f702 +timeCreated: 1675231640 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HEditorStyles.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs new file mode 100644 index 0000000..2e5717e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs @@ -0,0 +1,243 @@ +#if UNITY_EDITOR +using System; +using UnityEditor; +using UnityEditor.AnimatedValues; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Editor +{ + public static class HEditorUtils + { + private static GUIStyle s_linkStyle; + private static GUIStyle s_separatorStyle; + + public static void DrawLinkRow(params (string label, Action onClick)[] links) + { + if (s_linkStyle == null) + { + s_linkStyle = new GUIStyle(GUI.skin.label) + { + fontStyle = FontStyle.Bold, + fontSize = 10, + alignment = TextAnchor.MiddleLeft, + normal = { textColor = new Color(0.35f, 0.55f, 0.75f) }, + hover = { textColor = EditorGUIUtility.isProSkin ? Color.white : Color.black }, + // padding = new RectOffset(0, 0, 0, 0), + // margin = new RectOffset(0, 0, 0, 0) + }; + } + + if (s_separatorStyle == null) + { + s_separatorStyle = new GUIStyle(GUI.skin.label) + { + fontSize = 12, + alignment = TextAnchor.MiddleCenter, + normal = { textColor = new Color(0.9f, 0.9f, 0.9f,1f) }, + padding = new RectOffset(0, 0, 1, 0), + margin = new RectOffset(0, 0, 0, 0) + }; + } + + float maxWidth = EditorGUIUtility.currentViewWidth - 40; // scroll + float currentLineWidth = 0; + + GUILayout.BeginVertical(); + GUILayout.BeginHorizontal(); + + for (int i = 0; i < links.Length; i++) + { + var content = new GUIContent(links[i].label); + Vector2 size = s_linkStyle.CalcSize(content); + float neededWidth = size.x + 8; // text + | + + // new line + if (currentLineWidth + neededWidth > maxWidth) + { + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + currentLineWidth = 0; + } + + if (DrawClickableButton(links[i].label, onClick: links[i].onClick)) + { + // nothing here + } + currentLineWidth += size.x; + + if (i < links.Length - 1) + { + GUILayout.Space(8); + // GUILayout.Label("|", s_separatorStyle, GUILayout.Width(12)); + // GUILayout.Space(2); + + currentLineWidth += 8; // width | + } + } + + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + } + + public static bool DrawClickableButton(string text, Action onClick = null, GUIStyle baseStyle = null) + { + if (s_linkStyle == null) + { + s_linkStyle = new GUIStyle(baseStyle ?? GUI.skin.label) + { + fontStyle = FontStyle.Bold, + fontSize = 10, + alignment = TextAnchor.MiddleLeft, + normal = { textColor = new Color(0.35f, 0.55f, 0.75f) }, + hover = { textColor = EditorGUIUtility.isProSkin ? Color.white : Color.black } + }; + } + + Rect rect = GUILayoutUtility.GetRect(new GUIContent(text), s_linkStyle, GUILayout.ExpandWidth(false)); + bool clicked = GUI.Button(rect, text, s_linkStyle); + + EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); + + if (clicked) + onClick?.Invoke(); + + return clicked; + } + + public static bool DrawClickableLink(string text, string url, bool useEmoji = false, GUIStyle baseStyle = null) + { + if (s_linkStyle == null) + { + s_linkStyle = new GUIStyle(baseStyle ?? GUI.skin.label) + { + fontStyle = FontStyle.Bold, + fontSize = 10, + //normal = { textColor = new Color(0.20f, 0.50f, 0.80f) }, + normal = { textColor = new Color(0.35f, 0.55f, 0.75f) }, + hover = { textColor = EditorGUIUtility.isProSkin ? Color.white : Color.black } + }; + } + + if (useEmoji) + text += " \U0001F517"; //\U0001F310 + bool clicked = GUILayout.Button(text, s_linkStyle, GUILayout.ExpandWidth(false)); + EditorGUIUtility.AddCursorRect(GUILayoutUtility.GetLastRect(), MouseCursor.Link); + + if (clicked) + { + Application.OpenURL(url); + } + + return clicked; + } + + public readonly struct FoldoutScope : IDisposable + { + private readonly bool wasIndent; + + public FoldoutScope(AnimBool value, out bool shouldDraw, string label, bool indent = true, SerializedProperty toggle = null) + { + value.target = Foldout(value.target, label, toggle); + shouldDraw = EditorGUILayout.BeginFadeGroup(value.faded); + if (shouldDraw && indent) + { + Indent(); + wasIndent = true; + } + else + { + wasIndent = false; + } + } + + public void Dispose() + { + if (wasIndent) + EndIndent(); + EditorGUILayout.EndFadeGroup(); + } + } + + public static void HorizontalLine(float height = 1, float width = -1, Vector2 margin = new Vector2()) + { + GUILayout.Space(margin.x); + + var rect = EditorGUILayout.GetControlRect(false, height); + if (width > -1) + { + var centerX = rect.width / 2; + rect.width = width; + rect.x += centerX - width / 2; + } + + Color color = EditorStyles.label.active.textColor; + color.a = 0.5f; + EditorGUI.DrawRect(rect, color); + + GUILayout.Space(margin.y); + } + + public static bool Foldout(bool value, string label, SerializedProperty toggle = null) + { + bool _value; + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + EditorGUILayout.BeginHorizontal(); + + if (toggle != null && !toggle.boolValue) + { + EditorGUI.BeginDisabledGroup(true); + _value = EditorGUILayout.Toggle(value, EditorStyles.foldout); + EditorGUI.EndDisabledGroup(); + + _value = false; + } + else + { + _value = EditorGUILayout.Toggle(value, EditorStyles.foldout); + } + + if (toggle != null) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(toggle, GUIContent.none, GUILayout.Width(20)); + if (EditorGUI.EndChangeCheck() && toggle.boolValue) + _value = true; + } + + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + + var rect = GUILayoutUtility.GetLastRect(); + rect.x += 20; + rect.width -= 20; + + if (toggle != null && !toggle.boolValue) + { + EditorGUI.BeginDisabledGroup(true); + EditorGUI.LabelField(rect, label, EditorStyles.boldLabel); + EditorGUI.EndDisabledGroup(); + } + else + { + EditorGUI.LabelField(rect, label, EditorStyles.boldLabel); + } + + return _value; + } + + public static void Indent() + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(16); + EditorGUILayout.BeginVertical(); + } + + public static void EndIndent() + { + GUILayout.Space(10); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs.meta new file mode 100644 index 0000000..37dbe10 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HEditorUtils.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f1ca94cbca25bbd46b2e81a98884081a +timeCreated: 1675348234 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HEditorUtils.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs new file mode 100644 index 0000000..83011e1 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs @@ -0,0 +1,140 @@ +//pipelinedefine +#define H_URP + +#if UNITY_EDITOR + +using System.IO; +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using UnityEditor; +using UnityEngine; + +using HTraceSSGI.Scripts.Infrastructure.URP; + +namespace HTraceSSGI.Scripts.Editor +{ + public enum HTraceSSGIPreset + { + Performance = 1, + Optimized = 2, + Balanced = 3, + Quality = 4, + } + + [CustomEditor(typeof(HTraceSSGI))] + public class HTraceSSGIEditor : UnityEditor.Editor + { + private SerializedProperty _profile; + + HTraceSSGIProfile _cachedProfile; + UnityEditor.Editor _cachedProfileEditor; + + static GUIStyle _boxStyle; + + private void OnEnable() + { + _profile = serializedObject.FindProperty("Profile"); + } + + public override void OnInspectorGUI() + { + if (_boxStyle == null) + { + _boxStyle = new GUIStyle(GUI.skin.box); + _boxStyle.padding = new RectOffset(15, 10, 5, 5); + } + + if (HTraceSSGIRendererFeature.IsUseVolumes == true) + { + EditorGUILayout.HelpBox("\"Use Volumes\" checkbox in the HTrace SSGI Renderer feature is enabled, use the HTraceSSGI volume override in your scenes.", MessageType.Warning, wide: true); + return; + } + + EditorGUILayout.PropertyField(_profile); + + EditorGUILayout.Space(5); + + if (_profile.objectReferenceValue != null) + { + if (_cachedProfile != _profile.objectReferenceValue) + { + _cachedProfile = null; + } + if (_cachedProfile == null) + { + _cachedProfile = (HTraceSSGIProfile)_profile.objectReferenceValue; + _cachedProfileEditor = CreateEditor(_profile.objectReferenceValue); + } + + EditorGUILayout.BeginVertical(); + _cachedProfileEditor.OnInspectorGUI(); + + EditorGUILayout.Separator(); + + if (GUILayout.Button("Save As New Profile")) + { + ExportProfile(); + } + EditorGUILayout.EndVertical(); + } + else + { + EditorGUILayout.HelpBox("Create or assign a profile.", MessageType.Info); + if (GUILayout.Button("New Profile")) + { + CreateProfile(); + } + } + + serializedObject.ApplyModifiedProperties(); + } + + void CreateProfile() { + + var fp = CreateInstance(); + fp.name = "New HTrace SSGI Profile"; + + string path = "Assets"; + foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets)) { + path = AssetDatabase.GetAssetPath(obj); + if (File.Exists(path)) { + path = Path.GetDirectoryName(path); + } + break; + } + + string fullPath = path + "/" + fp.name + ".asset"; + fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath); + + AssetDatabase.CreateAsset(fp, fullPath); + AssetDatabase.SaveAssets(); + _profile.objectReferenceValue = fp; + EditorGUIUtility.PingObject(fp); + } + + void ExportProfile() { + var fp = (HTraceSSGIProfile)_profile.objectReferenceValue; + var newProfile = Instantiate(fp); + + string path = AssetDatabase.GetAssetPath(fp); + string fullPath = path; + if (string.IsNullOrEmpty(path)) { + path = "Assets"; + foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets)) { + path = AssetDatabase.GetAssetPath(obj); + if (File.Exists(path)) { + path = Path.GetDirectoryName(path); + } + break; + } + fullPath = path + "/" + fp.name + ".asset"; + } + fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath); + AssetDatabase.CreateAsset(newProfile, fullPath); + AssetDatabase.SaveAssets(); + _profile.objectReferenceValue = newProfile; + EditorGUIUtility.PingObject(fp); + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs.meta new file mode 100644 index 0000000..afce8ee --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1f39d10a78f94348bef222fc6f34a37a +timeCreated: 1761566211 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HTraceSSGIEditor.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs new file mode 100644 index 0000000..621eb2d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs @@ -0,0 +1,456 @@ +//pipelinedefine +#define H_URP + +#if UNITY_EDITOR +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Editor.WindowsAndMenu; +using HTraceSSGI.Scripts.Globals; +using UnityEditor; +using UnityEditor.AnimatedValues; +using UnityEditor.Rendering; +using UnityEngine; + + +namespace HTraceSSGI.Scripts.Editor +{ + [CustomEditor(typeof(HTraceSSGIProfile))] + internal class HTraceSSGIProfileEditor : UnityEditor.Editor + { + HTraceSSGIPreset _preset = HTraceSSGIPreset.Balanced; + + bool _globalSettingsTab = true; + bool _qualityTab = true; + bool _denoisingTab = true; + bool _debugTab = true; + + private AnimBool AnimBoolGeneralTab; + private AnimBool AnimBoolQualityTab; + private AnimBool AnimBoolDenoisingTab; + private AnimBool AnimBoolDebugTab; + private AnimBool AnimBoolEMPTY; + + bool _showPipelineIntegration = true; + bool _showVisualsArea = true; + bool _showTracingArea = true; + bool _showRenderingArea = true; + bool _showRestirValidationArea = true; + bool _showSpatialArea = true; + + SerializedProperty GeneralSettings; + SerializedProperty SSGISettings; + SerializedProperty DenoisingSettings; + SerializedProperty DebugSettings; + + // Debug Data + SerializedProperty EnableDebug; + SerializedProperty HTraceLayer; + + // General Tab + SerializedProperty DebugMode; + SerializedProperty HBuffer; + SerializedProperty MainCamera; + + SerializedProperty MetallicIndirectFallback; + SerializedProperty AmbientOverride; + SerializedProperty Multibounce; + + SerializedProperty ExcludeReceivingMask; + SerializedProperty ExcludeCastingMask; + SerializedProperty FallbackType; + SerializedProperty SkyIntensity; + //Apv + SerializedProperty ViewBias; + SerializedProperty NormalBias; + SerializedProperty SamplingNoise; + SerializedProperty DenoiseFallback; + + // Visuals + SerializedProperty BackfaceLighting; + SerializedProperty MaxRayLength; + SerializedProperty ThicknessMode; + SerializedProperty Thickness; + SerializedProperty Intensity; + SerializedProperty Falloff; + + // Quality tab + // Tracing + SerializedProperty RayCount; + SerializedProperty StepCount; + SerializedProperty RefineIntersection; + SerializedProperty FullResolutionDepth; + + // Rendering + SerializedProperty Checkerboard; + SerializedProperty RenderScale; + + // Denoising tab + SerializedProperty BrightnessClamp; + SerializedProperty MaxValueBrightnessClamp; + SerializedProperty MaxDeviationBrightnessClamp; + + // Temporal + SerializedProperty HalfStepValidation; + SerializedProperty SpatialOcclusionValidation; + SerializedProperty TemporalLightingValidation; + SerializedProperty TemporalOcclusionValidation; + + // Spatial Filter + SerializedProperty SpatialRadius; + SerializedProperty Adaptivity; + // SerializedProperty SpatialPassCount; + SerializedProperty RecurrentBlur; + SerializedProperty FireflySuppression; + + // Debug DEVS + SerializedProperty ShowBowels; + SerializedProperty ShowFullDebugLog; + SerializedProperty TestCheckBox1; + SerializedProperty TestCheckBox2; + SerializedProperty TestCheckBox3; + + private void OnEnable() + { + PropertiesRelative(); + + AnimBoolGeneralTab = new AnimBool(_globalSettingsTab); + AnimBoolGeneralTab.valueChanged.RemoveAllListeners(); + AnimBoolGeneralTab.valueChanged.AddListener(Repaint); + + AnimBoolQualityTab = new AnimBool(_qualityTab); + AnimBoolQualityTab.valueChanged.RemoveAllListeners(); + AnimBoolQualityTab.valueChanged.AddListener(Repaint); + + AnimBoolDenoisingTab = new AnimBool(_denoisingTab); + AnimBoolDenoisingTab.valueChanged.RemoveAllListeners(); + AnimBoolDenoisingTab.valueChanged.AddListener(Repaint); + + AnimBoolDebugTab = new AnimBool(_debugTab); + AnimBoolDebugTab.valueChanged.RemoveAllListeners(); + AnimBoolDebugTab.valueChanged.AddListener(Repaint); + + AnimBoolEMPTY = new AnimBool(false); + } + + protected virtual void OnSceneGUI() + { + HTraceSSGI hTraceSSGI = (HTraceSSGI)target; + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + UpdateStandartStyles(); + // base.OnInspectorGUI(); + //return; + + AnimBoolEMPTY = new AnimBool(false); + + Color standartBackgroundColor = GUI.backgroundColor; + Color standartColor = GUI.color; + + WarningsHandle(); + +// ------------------------------------- Global settings ---------------------------------------------------------- + + using (new HEditorUtils.FoldoutScope(AnimBoolGeneralTab, out var shouldDraw, "Global Settings")) + { + _globalSettingsTab = shouldDraw; + if (shouldDraw) + { + EditorGUILayout.Space(3f); + + EditorGUILayout.BeginHorizontal(); + _preset = (HTraceSSGIPreset)EditorGUILayout.EnumPopup(new GUIContent("Preset"), _preset); + if (GUILayout.Button("Apply", GUILayout.Width(60))) + { + HTraceSSGIProfile profileLocal = HTraceSSGISettings.ActiveProfile; + profileLocal.ApplyPreset(_preset); + EditorUtility.SetDirty(target); + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(3f); + + serializedObject.Update(); + + EditorGUILayout.PropertyField(DebugMode, HEditorStyles.DebugModeContent); + if (DebugMode.enumValueIndex == 1) + EditorGUILayout.PropertyField(HBuffer, HEditorStyles.HBuffer); + EditorGUILayout.Space(5f); + + +#if UNITY_2023_3_OR_NEWER + EditorGUILayout.PropertyField(ExcludeCastingMask, HEditorStyles.ExcludeCastingMask); + EditorGUILayout.PropertyField(ExcludeReceivingMask, HEditorStyles.ExcludeReceivingMask); +#endif + EditorGUILayout.Space(3f); + + EditorGUILayout.PropertyField(FallbackType, HEditorStyles.FallbackType); + if ((Globals.FallbackType)FallbackType.enumValueIndex == Globals.FallbackType.Sky) + EditorGUILayout.Slider(SkyIntensity, 0.0f, 1.0f, HEditorStyles.SkyIntensity); + + _showPipelineIntegration = EditorGUILayout.BeginFoldoutHeaderGroup(_showPipelineIntegration, "Pipeline Integration"); + if (_showPipelineIntegration) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(MetallicIndirectFallback, new GUIContent("Metallic Indirect Fallback")); + EditorGUILayout.PropertyField(AmbientOverride, new GUIContent("Ambient Override")); + if (RenderSettings.ambientIntensity > 1.0f && AmbientOverride.boolValue == true) + EditorGUILayout.HelpBox("Ambient Override may not work correctly when the Environment Lighting Multiplier is set above 1 !", MessageType.Warning); + EditorGUILayout.PropertyField(Multibounce, new GUIContent("Multibounce")); + EditorGUI.indentLevel--; + EditorGUILayout.Space(3f); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + + EditorGUILayout.Space(3f); + + { + _showVisualsArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showVisualsArea, "Visuals"); + if (_showVisualsArea) + { + EditorGUI.indentLevel++; + + EditorGUILayout.Slider(BackfaceLighting, 0.0f, 1.0f, HEditorStyles.BackfaceLighting); + EditorGUILayout.PropertyField(MaxRayLength, HEditorStyles.MaxRayLength); + if (MaxRayLength.floatValue < 0) + MaxRayLength.floatValue = 0f; + EditorGUILayout.PropertyField(ThicknessMode, HEditorStyles.ThicknessMode); + EditorGUILayout.Slider(Thickness, 0.0f, 1.0f, HEditorStyles.Thickness); + EditorGUILayout.Slider(Intensity, 0.1f, 5.0f, HEditorStyles.Intensity); + EditorGUILayout.Slider(Falloff, 0.0f, 1.0f, HEditorStyles.Falloff); + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(3f); + } + + + } + } + + // ------------------------------------- Quality ---------------------------------------------------------- + + using (new HEditorUtils.FoldoutScope(AnimBoolQualityTab, out var shouldDraw, "Quality")) + { + _qualityTab = shouldDraw; + if (shouldDraw) + { + EditorGUILayout.Space(3f); + _showTracingArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showTracingArea, "Tracing"); + if (_showTracingArea) + { + EditorGUI.indentLevel++; + + RayCount.intValue = EditorGUILayout.IntSlider(HEditorStyles.RayCount, RayCount.intValue, 2, 16); + StepCount.intValue = EditorGUILayout.IntSlider(HEditorStyles.StepCount, StepCount.intValue, 8, 64); + EditorGUILayout.PropertyField(RefineIntersection, HEditorStyles.RefineIntersection); + EditorGUILayout.PropertyField(FullResolutionDepth, HEditorStyles.FullResolutionDepth); + + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(5f); + + _showRenderingArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showRenderingArea, "Rendering"); + if (_showRenderingArea) + { + EditorGUI.indentLevel++; + + EditorGUILayout.PropertyField(Checkerboard, HEditorStyles.Checkerboard); + EditorGUILayout.Slider(RenderScale, 0.5f, 1.0f, HEditorStyles.RenderScale); + RenderScale.floatValue = RenderScale.floatValue.RoundToCeilTail(2); + if (Mathf.Approximately(RenderScale.floatValue, 1.0f) == false) + { + EditorGUI.indentLevel++; + + EditorGUI.indentLevel--; + } + + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(3f); + } + } + + // ------------------------------------- Denoising ---------------------------------------------------------- + + using (new HEditorUtils.FoldoutScope(AnimBoolDenoisingTab, out var shouldDraw, "Denoising")) + { + _denoisingTab = shouldDraw; + if (shouldDraw) + { + EditorGUILayout.Space(3f); + + EditorGUILayout.PropertyField(BrightnessClamp, HEditorStyles.BrightnessClamp); + if ((BrightnessClamp)BrightnessClamp.enumValueIndex == Globals.BrightnessClamp.Manual) + EditorGUILayout.Slider(MaxValueBrightnessClamp, 1.0f, 30.0f, HEditorStyles.MaxValueBrightnessClamp); + if ((BrightnessClamp)BrightnessClamp.enumValueIndex == Globals.BrightnessClamp.Automatic) + EditorGUILayout.Slider(MaxDeviationBrightnessClamp, 1.0f, 5.0f, HEditorStyles.MaxDeviationBrightnessClamp); + EditorGUILayout.Space(5f); + + _showRestirValidationArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showRestirValidationArea, "ReSTIR Validation"); + if (_showRestirValidationArea) + { + EditorGUI.indentLevel++; + + EditorGUILayout.PropertyField(HalfStepValidation, HEditorStyles.HalfStepValidation); + EditorGUILayout.Space(3f); + + EditorGUILayout.LabelField(new GUIContent("Validation Types:"), HEditorStyles.bold); + EditorGUILayout.PropertyField(SpatialOcclusionValidation, HEditorStyles.SpatialOcclusionValidation); + EditorGUILayout.PropertyField(TemporalLightingValidation, HEditorStyles.TemporalLightingValidation); + EditorGUILayout.PropertyField(TemporalOcclusionValidation, HEditorStyles.TemporalOcclusionValidation); + + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(5f); + + _showSpatialArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showSpatialArea, "Spatial Filter"); + if (_showSpatialArea) + { + EditorGUI.indentLevel++; + EditorGUILayout.Slider(SpatialRadius, 0.0f, 1.0f, HEditorStyles.SpatialRadius); + EditorGUILayout.Slider(Adaptivity, 0.0f, 1.0f, HEditorStyles.Adaptivity); + // SpatialPassCount.intValue = EditorGUILayout.IntSlider(HEditorStyles.SpatialPassCount, SpatialPassCount.intValue, 0, 4); + EditorGUILayout.PropertyField(RecurrentBlur, HEditorStyles.RecurrentBlur); + EditorGUILayout.PropertyField(FireflySuppression, HEditorStyles.FireflySuppression); + + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(3f); + } + } + + // ------------------------------------- Debug settings ---------------------------------------------------------- + + + HEditorUtils.HorizontalLine(1f); + EditorGUILayout.Space(3f); + + //HEditorUtils.DrawClickableLink($"HTrace AO Version: {HNames.HTRACE_AO_VERSION}", HNames.HTRACE_AO_DOCUMENTATION_LINK, true); + HEditorUtils.DrawLinkRow( + ($"Documentation (v." + HNames.HTRACE_SSGI_VERSION + ")", () => Application.OpenURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK)), + ("Discord", () => Application.OpenURL(HNames.HTRACE_DISCORD_LINK)), + ("Bug report", () => HBugReporterWindow.ShowWindow()) + ); + + GUI.backgroundColor = standartBackgroundColor; + GUI.color = standartColor; + + serializedObject.ApplyModifiedProperties(); + } + + private void WarningsHandle() + { + } + + private void DebugPart() + { + using (new HEditorUtils.FoldoutScope(AnimBoolDebugTab, out var shouldDraw, HEditorStyles.DebugContent.text, toggle: EnableDebug)) + { + _debugTab = shouldDraw; + if (shouldDraw) + { + //EditorGUILayout.PropertyField(EnableDebug, HEditorStyles.OcclusionEnable); + + //if (EnableDebug.boolValue == true) + { + EditorGUILayout.PropertyField(HTraceLayer, HEditorStyles.hTraceLayerContent); + } + + EditorGUILayout.PropertyField(ShowBowels, new GUIContent("Show Bowels")); + ShowFullDebugLog.boolValue = EditorGUILayout.Toggle(new GUIContent("Show Full Debug Log"), ShowFullDebugLog.boolValue); + + TestCheckBox1.boolValue = EditorGUILayout.Toggle(new GUIContent("TestCheckBox1"), TestCheckBox1.boolValue); + TestCheckBox2.boolValue = EditorGUILayout.Toggle(new GUIContent("TestCheckBox2"), TestCheckBox2.boolValue); + TestCheckBox3.boolValue = EditorGUILayout.Toggle(new GUIContent("TestCheckBox3"), TestCheckBox3.boolValue); + + EditorGUILayout.Space(3); + } + } + } + + private void UpdateStandartStyles() + { + HEditorStyles.foldout.fontStyle = FontStyle.Bold; + } + + private void PropertiesRelative() + { + GeneralSettings = serializedObject.FindProperty("GeneralSettings"); + SSGISettings = serializedObject.FindProperty("SSGISettings"); + DenoisingSettings = serializedObject.FindProperty("DenoisingSettings"); + DebugSettings = serializedObject.FindProperty("DebugSettings"); + + // Debug Data + HTraceLayer = DebugSettings.FindPropertyRelative("HTraceLayer"); + ShowBowels = DebugSettings.FindPropertyRelative("ShowBowels"); + ShowFullDebugLog = DebugSettings.FindPropertyRelative("ShowFullDebugLog"); + TestCheckBox1 = DebugSettings.FindPropertyRelative("TestCheckBox1"); + TestCheckBox2 = DebugSettings.FindPropertyRelative("TestCheckBox2"); + TestCheckBox3 = DebugSettings.FindPropertyRelative("TestCheckBox3"); + + // Global Tab + DebugMode = GeneralSettings.FindPropertyRelative("DebugMode"); + HBuffer = GeneralSettings.FindPropertyRelative("HBuffer"); + ExcludeReceivingMask = GeneralSettings.FindPropertyRelative("ExcludeReceivingMask"); + ExcludeCastingMask = GeneralSettings.FindPropertyRelative("ExcludeCastingMask"); + MetallicIndirectFallback = GeneralSettings.FindPropertyRelative("MetallicIndirectFallback"); + AmbientOverride = GeneralSettings.FindPropertyRelative("AmbientOverride"); + Multibounce = GeneralSettings.FindPropertyRelative("Multibounce"); + FallbackType = GeneralSettings.FindPropertyRelative("FallbackType"); + SkyIntensity = GeneralSettings.FindPropertyRelative("_skyIntensity"); + ViewBias = GeneralSettings.FindPropertyRelative("_viewBias"); + NormalBias = GeneralSettings.FindPropertyRelative("_normalBias"); + SamplingNoise = GeneralSettings.FindPropertyRelative("_samplingNoise"); + DenoiseFallback = GeneralSettings.FindPropertyRelative("DenoiseFallback"); + + // Visuals + BackfaceLighting = SSGISettings.FindPropertyRelative("_backfaceLighting"); + MaxRayLength = SSGISettings.FindPropertyRelative("_maxRayLength"); + ThicknessMode = SSGISettings.FindPropertyRelative("ThicknessMode"); + Thickness = SSGISettings.FindPropertyRelative("_thickness"); + Intensity = SSGISettings.FindPropertyRelative("_intensity"); + Falloff = SSGISettings.FindPropertyRelative("_falloff"); + + // Quality tab + // Tracing + RayCount = SSGISettings.FindPropertyRelative("_rayCount"); + StepCount = SSGISettings.FindPropertyRelative("_stepCount"); + RefineIntersection = SSGISettings.FindPropertyRelative("RefineIntersection"); + FullResolutionDepth = SSGISettings.FindPropertyRelative("FullResolutionDepth"); + + // Rendering + Checkerboard = SSGISettings.FindPropertyRelative("Checkerboard"); + RenderScale = SSGISettings.FindPropertyRelative("_renderScale"); + + // Denoising tab + BrightnessClamp = DenoisingSettings.FindPropertyRelative("BrightnessClamp"); + MaxValueBrightnessClamp = DenoisingSettings.FindPropertyRelative("_maxValueBrightnessClamp"); + MaxDeviationBrightnessClamp = DenoisingSettings.FindPropertyRelative("_maxDeviationBrightnessClamp"); + + // ReSTIR Validation + HalfStepValidation = DenoisingSettings.FindPropertyRelative("HalfStepValidation"); + SpatialOcclusionValidation = DenoisingSettings.FindPropertyRelative("SpatialOcclusionValidation"); + TemporalLightingValidation = DenoisingSettings.FindPropertyRelative("TemporalLightingValidation"); + TemporalOcclusionValidation = DenoisingSettings.FindPropertyRelative("TemporalOcclusionValidation"); + + // Spatial + SpatialRadius = DenoisingSettings.FindPropertyRelative("_spatialRadius"); + Adaptivity = DenoisingSettings.FindPropertyRelative("_adaptivity"); + // SpatialPassCount = DenoisingData.FindPropertyRelative("_spatialPassCount"); + RecurrentBlur = DenoisingSettings.FindPropertyRelative("RecurrentBlur"); + FireflySuppression = DenoisingSettings.FindPropertyRelative("FireflySuppression"); + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs.meta new file mode 100644 index 0000000..9caeb27 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2a391e47a8d563041a61da4e5d3d9d51 +timeCreated: 1674796690 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HTraceSSGIProfileEditor.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs new file mode 100644 index 0000000..fff09a4 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs @@ -0,0 +1,31 @@ +//pipelinedefine +#define H_URP + +#if UNITY_EDITOR +using HTraceSSGI.Scripts.Infrastructure.URP; +using UnityEditor; +using UnityEditor.Rendering.Universal; + +namespace HTraceSSGI.Scripts.Editor +{ + [CustomEditor(typeof(HTraceSSGIRendererFeature))] + public class HTraceSSGIRendererFeatureEditor : ScriptableRendererFeatureEditor + { + SerializedProperty useVolumes; + + private void OnEnable() + { + useVolumes = serializedObject.FindProperty("UseVolumes"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUILayout.PropertyField(useVolumes); + + serializedObject.ApplyModifiedProperties(); + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs.meta new file mode 100644 index 0000000..55353de --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c07ed2e0332d41d28f81cb8f1976129b +timeCreated: 1761571199 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HTraceSSGIRendererFeatureEditor.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs new file mode 100644 index 0000000..0317337 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs @@ -0,0 +1,468 @@ +//pipelinedefine +#define H_URP + +using System; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +#if UNITY_EDITOR +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Editor.WindowsAndMenu; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Infrastructure.URP; +using UnityEditor; +using UnityEditor.Rendering; +using UnityEditor.AnimatedValues; + +namespace HTraceSSGI.Scripts.Editor +{ + [CanEditMultipleObjects] +#if UNITY_2022_2_OR_NEWER + [CustomEditor(typeof(HTraceSSGIVolume))] +#else +[VolumeComponentEditor(typeof(HTraceSSGIVolume))] +#endif + internal class HTraceSSGIVolumeEditorURP : VolumeComponentEditor + { + private const string NO_RENDERER_FEATURE_MESSAGE = "HTrace Screen Space Global Illumination feature is missing in the active URP renderer."; + private const string RENDERER_FEATURE_OFF_MESSAGE = "HTrace Screen Space Global Illumination is disabled in the active URP renderer."; + private const string LIGHTING_MULTIPLIER_ABOVE_1_MESSAGE = "Ambient Override may not work correctly when the Environment Lighting Multiplier is set above 1 !"; + private const string RENDETIN_LIGHTING_SETTINGS_WINDOW_PATH = "Window/Rendering/Lighting"; + + private Texture2D m_Icon; + + SerializedDataParameter p_Enable; + + // General + internal SerializedDataParameter p_DebugMode; + internal SerializedDataParameter p_HBuffer; + internal SerializedDataParameter p_ExcludeCastingMask; + internal SerializedDataParameter p_ExcludeReceivingMask; + internal SerializedDataParameter p_FallbackType; + internal SerializedDataParameter p_SkyIntensity; + internal SerializedDataParameter p_MetallicIndirectFallback; + internal SerializedDataParameter p_AmbientOverride; + internal SerializedDataParameter p_Multibounce; + + //Apv + internal SerializedDataParameter p_ViewBias; + internal SerializedDataParameter p_NormalBias; + internal SerializedDataParameter p_SamplingNoise; + internal SerializedDataParameter p_IntensityMultiplier; + internal SerializedDataParameter p_DenoiseFallback; + + // Visuals + internal SerializedDataParameter p_BackfaceLighting; + internal SerializedDataParameter p_MaxRayLength; + internal SerializedDataParameter p_ThicknessMode; + internal SerializedDataParameter p_Thickness; + internal SerializedDataParameter p_Intensity; + internal SerializedDataParameter p_Falloff; + + // Quality tab + // Tracing + internal SerializedDataParameter p_RayCount; + internal SerializedDataParameter p_StepCount; + internal SerializedDataParameter p_RefineIntersection; + internal SerializedDataParameter p_FullResolutionDepth; + + // Rendering + internal SerializedDataParameter p_Checkerboard; + internal SerializedDataParameter p_RenderScale; + + // Denoising tab + internal SerializedDataParameter p_BrightnessClamp; + internal SerializedDataParameter p_MaxValueBrightnessClamp; + internal SerializedDataParameter p_MaxDeviationBrightnessClamp; + + // Temporal + internal SerializedDataParameter p_HalfStepValidation; + internal SerializedDataParameter p_SpatialOcclusionValidation; + internal SerializedDataParameter p_TemporalLightingValidation; + internal SerializedDataParameter p_TemporalOcclusionValidation; + + // Spatial Filter + internal SerializedDataParameter p_SpatialRadius; + internal SerializedDataParameter p_Adaptivity; + internal SerializedDataParameter p_RecurrentBlur; + internal SerializedDataParameter p_FireflySuppression; + + //Debug + internal SerializedDataParameter p_ShowBowels; + + // Main foldout groups + private AnimBool AnimBoolGeneralTab; + private AnimBool AnimBoolQualityTab; + private AnimBool AnimBoolDenoisingTab; + private AnimBool AnimBoolDebugTab; + private AnimBool AnimBoolEMPTY; + + // Menu state + private bool _showPipelineIntegration = true; + private bool _showVisualsArea = true; + private bool _showTracingArea = true; + private bool _showRenderingArea = true; + private bool _showRestirValidationArea = true; + private bool _showSpatialArea = true; + + static HTraceSSGIPreset _preset = HTraceSSGIPreset.Balanced; + + public override void OnEnable() + { + var o = new PropertyFetcher(serializedObject); + + m_Icon = Resources.Load("SSGI UI Card"); + + p_Enable = Unpack(o.Find(x => x.Enable)); + // General Settings + p_DebugMode = Unpack(o.Find(x => x.DebugMode)); + p_HBuffer = Unpack(o.Find(x => x.HBuffer)); +#if UNITY_2023_3_OR_NEWER + p_ExcludeReceivingMask = Unpack(o.Find(x => x.ExcludeReceivingMask)); + p_ExcludeCastingMask = Unpack(o.Find(x => x.ExcludeCastingMask)); +#endif + p_FallbackType = Unpack(o.Find(x => x.FallbackType)); + p_SkyIntensity = Unpack(o.Find(x => x.SkyIntensity)); + //Pipeline integration + p_MetallicIndirectFallback = Unpack(o.Find(x => x.MetallicIndirectFallback)); + p_AmbientOverride = Unpack(o.Find(x => x.AmbientOverride)); + p_Multibounce = Unpack(o.Find(x => x.Multibounce)); + //Apv + p_ViewBias = Unpack(o.Find(x => x.ViewBias)); + p_NormalBias = Unpack(o.Find(x => x.NormalBias)); + p_SamplingNoise = Unpack(o.Find(x => x.SamplingNoise)); + p_IntensityMultiplier = Unpack(o.Find(x => x.IntensityMultiplier)); + p_DenoiseFallback = Unpack(o.Find(x => x.DenoiseFallback)); + + // Visuals + p_BackfaceLighting = Unpack(o.Find(x => x.BackfaceLighting)); + p_MaxRayLength = Unpack(o.Find(x => x.MaxRayLength)); + p_ThicknessMode = Unpack(o.Find(x => x.ThicknessMode)); + p_Thickness = Unpack(o.Find(x => x.Thickness)); + p_Intensity = Unpack(o.Find(x => x.Intensity)); + p_Falloff = Unpack(o.Find(x => x.Falloff)); + + // Quality tab + // Tracing + p_RayCount = Unpack(o.Find(x => x.RayCount)); + p_StepCount = Unpack(o.Find(x => x.StepCount)); + p_RefineIntersection = Unpack(o.Find(x => x.RefineIntersection)); + p_FullResolutionDepth = Unpack(o.Find(x => x.FullResolutionDepth)); + + // Rendering + p_Checkerboard = Unpack(o.Find(x => x.Checkerboard)); + p_RenderScale = Unpack(o.Find(x => x.RenderScale)); + + // Denoising tab + p_BrightnessClamp = Unpack(o.Find(x => x.BrightnessClamp)); + p_MaxValueBrightnessClamp = Unpack(o.Find(x => x.MaxValueBrightnessClamp)); + p_MaxDeviationBrightnessClamp = Unpack(o.Find(x => x.MaxDeviationBrightnessClamp)); + + // Temporal + p_HalfStepValidation = Unpack(o.Find(x => x.HalfStepValidation)); + p_SpatialOcclusionValidation = Unpack(o.Find(x => x.SpatialOcclusionValidation)); + p_TemporalLightingValidation = Unpack(o.Find(x => x.TemporalLightingValidation)); + p_TemporalOcclusionValidation = Unpack(o.Find(x => x.TemporalOcclusionValidation)); + + // Spatial Filter + p_SpatialRadius = Unpack(o.Find(x => x.SpatialRadius)); + p_Adaptivity = Unpack(o.Find(x => x.Adaptivity)); + p_RecurrentBlur = Unpack(o.Find(x => x.RecurrentBlur)); + p_FireflySuppression = Unpack(o.Find(x => x.FireflySuppression)); + + // Debug + p_ShowBowels = Unpack(o.Find(x => x.ShowBowels)); + + AnimBoolGeneralTab = new AnimBool(true); + AnimBoolGeneralTab.valueChanged.RemoveAllListeners(); + AnimBoolGeneralTab.valueChanged.AddListener(Repaint); + + AnimBoolQualityTab = new AnimBool(true); + AnimBoolQualityTab.valueChanged.RemoveAllListeners(); + AnimBoolQualityTab.valueChanged.AddListener(Repaint); + + AnimBoolDenoisingTab = new AnimBool(true); + AnimBoolDenoisingTab.valueChanged.RemoveAllListeners(); + AnimBoolDenoisingTab.valueChanged.AddListener(Repaint); + + AnimBoolDebugTab = new AnimBool(true); //_debugTab.boolValue + AnimBoolDebugTab.valueChanged.RemoveAllListeners(); + AnimBoolDebugTab.valueChanged.AddListener(Repaint); + + AnimBoolEMPTY = new AnimBool(false); + } + + public override void OnInspectorGUI() + { + var hTraceRendererFeature = HRendererURP.GetRendererFeatureByTypeName(nameof(HTraceSSGIRendererFeature)) as HTraceSSGIRendererFeature; + if (hTraceRendererFeature == null) + { + EditorGUILayout.Space(); + CoreEditorUtils.DrawFixMeBox(NO_RENDERER_FEATURE_MESSAGE, MessageType.Error, HEditorStyles.FixButtonName, () => + { + HRendererURP.AddHTraceRendererFeatureToUniversalRendererData(); + GUIUtility.ExitGUI(); + }); + //EditorGUILayout.HelpBox(NO_RENDERER_FEATURE_MESSAGE, MessageType.Error, wide: true); + return; + } + else if (!hTraceRendererFeature.isActive) + { + EditorGUILayout.Space(); + CoreEditorUtils.DrawFixMeBox(RENDERER_FEATURE_OFF_MESSAGE, MessageType.Warning, HEditorStyles.FixButtonName, () => + { + hTraceRendererFeature.SetActive(true); + GUIUtility.ExitGUI(); + }); + EditorGUILayout.Space(); + } + + if (m_Icon != null) + { + //GUILayout.Label(m_Icon, HEditorStyles.icon, GUILayout.ExpandWidth(false)); + Rect rect = GUILayoutUtility.GetAspectRect((float)m_Icon.width / m_Icon.height); + rect.xMin += 4; + rect.xMax -= 4; + GUI.DrawTexture(rect, m_Icon, ScaleMode.ScaleToFit); + EditorGUILayout.Space(5f); + } + + if (HTraceSSGIRendererFeature.IsUseVolumes == false) + { + CoreEditorUtils.DrawFixMeBox("\"Use Volumes\" checkbox in the HTrace SSGI Renderer feature is disabled, use the HTraceSSGI component in your scenes.", MessageType.Warning, HEditorStyles.ChangeButtonName, () => + { + hTraceRendererFeature.UseVolumes = true; + GUIUtility.ExitGUI(); + }); + return; + } + + PropertyField(p_Enable); + EditorGUILayout.Space(5f); + + // ------------------------------------- Global settings ---------------------------------------------------------- + + using (new HEditorUtils.FoldoutScope(AnimBoolGeneralTab, out var shouldDraw, HEditorStyles.GlobalSettings.text)) + { + if (shouldDraw) + { + + using (new IndentLevelScope(10)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel("Preset"); + + _preset = (HTraceSSGIPreset)EditorGUILayout.EnumPopup(_preset); + + if (GUILayout.Button("Apply", GUILayout.Width(60))) + { + HTraceSSGIPresetData.ApplyPresetVolume(this, _preset); + EditorUtility.SetDirty(target); + } + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.Space(5f); + + PropertyField(p_DebugMode); + if((DebugMode)p_DebugMode.value.enumValueIndex == DebugMode.MainBuffers) + { + PropertyField(p_HBuffer); + } + EditorGUILayout.Space(5f); + +#if UNITY_2023_3_OR_NEWER + PropertyField(p_ExcludeCastingMask); + PropertyField(p_ExcludeReceivingMask); +#endif + EditorGUILayout.Space(3f); + + PropertyField(p_FallbackType); + if ((Globals.FallbackType)p_FallbackType.value.enumValueIndex == Globals.FallbackType.Sky) + PropertyField(p_SkyIntensity); + +#if UNITY_6000_0_OR_NEWER + if ((FallbackType)p_FallbackType.value.enumValueIndex == Globals.FallbackType.APV) + { + using (new IndentLevelScope()) + { + PropertyField(p_ViewBias); + PropertyField(p_NormalBias); + PropertyField(p_SamplingNoise); + PropertyField(p_IntensityMultiplier); + PropertyField(p_DenoiseFallback); + } + } + if ((FallbackType)p_FallbackType.value.enumValueIndex == Globals.FallbackType.Sky) + { + using (new IndentLevelScope()) + PropertyField(p_DenoiseFallback); + } +#endif + EditorGUILayout.Space(5f); + { + _showPipelineIntegration = EditorGUILayout.BeginFoldoutHeaderGroup(_showPipelineIntegration, HEditorStyles.PipelineIntegration.text); + if (_showPipelineIntegration) + { + using (new IndentLevelScope()) + { + PropertyField(p_MetallicIndirectFallback); + PropertyField(p_AmbientOverride); + if (RenderSettings.ambientIntensity > 1.0f && p_AmbientOverride.value.boolValue == true) + { + CoreEditorUtils.DrawFixMeBox(LIGHTING_MULTIPLIER_ABOVE_1_MESSAGE, MessageType.Warning, HEditorStyles.OpenButtonName, () => + { + EditorApplication.ExecuteMenuItem(RENDETIN_LIGHTING_SETTINGS_WINDOW_PATH); + GUIUtility.ExitGUI(); + }); + } + PropertyField(p_Multibounce); + } + EditorGUILayout.Space(3f); + } + EditorGUILayout.EndFoldoutHeaderGroup(); + } + EditorGUILayout.Space(3f); + + { + _showVisualsArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showVisualsArea, HEditorStyles.Visuals.text); + if (_showVisualsArea) + { + using (new IndentLevelScope()) + { + PropertyField(p_BackfaceLighting); + PropertyField(p_MaxRayLength); + if (p_MaxRayLength.value.floatValue < 0) + p_MaxRayLength.value.floatValue = 0f; + PropertyField(p_ThicknessMode); + PropertyField(p_Thickness); + PropertyField(p_Intensity); + PropertyField(p_Falloff); + } + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(3f); + } + } + } + + // ------------------------------------- Quality ---------------------------------------------------------- + + using (new HEditorUtils.FoldoutScope(AnimBoolQualityTab, out var shouldDraw, HEditorStyles.Quality.text)) + { + if (shouldDraw) + { + EditorGUILayout.Space(3f); + _showTracingArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showTracingArea, HEditorStyles.Tracing.text); + if (_showTracingArea) + { + using (new IndentLevelScope()) + { + PropertyField(p_RayCount); + PropertyField(p_StepCount); + PropertyField(p_RefineIntersection); + PropertyField(p_FullResolutionDepth); + } + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(5f); + + _showRenderingArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showRenderingArea, HEditorStyles.Rendering.text); + if (_showRenderingArea) + { + using (new IndentLevelScope()) + { + PropertyField(p_Checkerboard); + PropertyField(p_RenderScale); + p_RenderScale.value.floatValue = p_RenderScale.value.floatValue.RoundToCeilTail(2); + } + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(3f); + } + } + + // ------------------------------------- Denoising ---------------------------------------------------------- + + using (new HEditorUtils.FoldoutScope(AnimBoolDenoisingTab, out var shouldDraw, HEditorStyles.Denoising.text)) + { + if (shouldDraw) + { + EditorGUILayout.Space(3f); + + PropertyField(p_BrightnessClamp); + if ((BrightnessClamp)p_BrightnessClamp.value.enumValueIndex == Globals.BrightnessClamp.Manual) + PropertyField(p_MaxValueBrightnessClamp); + if ((BrightnessClamp)p_BrightnessClamp.value.enumValueIndex == Globals.BrightnessClamp.Automatic) + PropertyField(p_MaxDeviationBrightnessClamp); + EditorGUILayout.Space(5f); + + _showRestirValidationArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showRestirValidationArea, HEditorStyles.ReSTIRValidation.text); + if (_showRestirValidationArea) + { + using (new IndentLevelScope()) + { + PropertyField(p_HalfStepValidation); + EditorGUILayout.Space(3f); + + EditorGUILayout.LabelField(HEditorStyles.ValidationTypes, HEditorStyles.bold); + PropertyField(p_SpatialOcclusionValidation); + PropertyField(p_TemporalLightingValidation); + PropertyField(p_TemporalOcclusionValidation); + } + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(5f); + + _showSpatialArea = EditorGUILayout.BeginFoldoutHeaderGroup(_showSpatialArea, HEditorStyles.SpatialFilter.text); + if (_showSpatialArea) + { + using (new IndentLevelScope()) + { + PropertyField(p_SpatialRadius); + PropertyField(p_Adaptivity); + PropertyField(p_RecurrentBlur); + PropertyField(p_FireflySuppression); + } + } + + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(3f); + } + } + + + HEditorUtils.HorizontalLine(1f); + EditorGUILayout.Space(3f); + + //HEditorUtils.DrawClickableLink($"HTrace AO Version: {HNames.HTRACE_AO_VERSION}", HNames.HTRACE_AO_DOCUMENTATION_LINK, true); + HEditorUtils.DrawLinkRow( + ($"Documentation (v." + HNames.HTRACE_SSGI_VERSION + ")", () => Application.OpenURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK)), + ("Discord", () => Application.OpenURL(HNames.HTRACE_DISCORD_LINK)), + ("Bug report", () => HBugReporterWindow.ShowWindow()) + ); + } + + private void DebugPart() + { + using (new HEditorUtils.FoldoutScope(AnimBoolDebugTab, out var shouldDraw, HEditorStyles.Debug.text)) + { + if (shouldDraw) + { + EditorGUILayout.Space(3f); + + PropertyField(p_ShowBowels); + + EditorGUILayout.Space(3f); + } + } + } + } +} +#endif //UNITY_EDITOR diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs.meta new file mode 100644 index 0000000..5ecae6a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b83a85dd560147da90cf7c0d4143a78c +timeCreated: 1757342219 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/HTraceSSGIVolumeEditorURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu.meta new file mode 100644 index 0000000..3e06865 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f30ffee4f8a6491fa30599d846fd00eb +timeCreated: 1757344404 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs new file mode 100644 index 0000000..4ebe9ac --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs @@ -0,0 +1,41 @@ +#if UNITY_EDITOR +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using UnityEditor; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Editor.WindowsAndMenu +{ + [InitializeOnLoad] + public static class AssetWelcomeLoader + { + static AssetWelcomeLoader() + { + EditorApplication.delayCall += TryShowWelcome; + } + + private static void TryShowWelcome() + { + if (SessionState.GetBool(HNames.HTRACE_WELCOME_SHOW_SESSION, false)) + return; + SessionState.SetBool(HNames.HTRACE_WELCOME_SHOW_SESSION, true); + + bool dontShowAgain = EditorPrefs.GetBool(HNames.HTRACE_SHOW_KEY, false); + string currentUnityVersion = Application.unityVersion; + string savedUnityVersion = EditorPrefs.GetString(HNames.HTRACE_UNITY_VERSION_KEY, string.Empty); + + bool unityVersionChanged = savedUnityVersion != currentUnityVersion; + bool isLts = HExtensions.IsUnityLTS(currentUnityVersion); + + bool shouldShowWelcome = !dontShowAgain || (unityVersionChanged && !isLts); + + if (shouldShowWelcome) + { + AssetWelcomeWindow.ShowWindow(); + } + + EditorPrefs.SetString(HNames.HTRACE_UNITY_VERSION_KEY, currentUnityVersion); + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs.meta new file mode 100644 index 0000000..05906eb --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b548ee64286c45f48d34d1dc643c5c30 +timeCreated: 1766077710 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeLoader.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs new file mode 100644 index 0000000..acd9019 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs @@ -0,0 +1,139 @@ +#if UNITY_EDITOR +using System; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using UnityEditor; +using UnityEngine; + +namespace HTraceSSGI.Scripts.Editor.WindowsAndMenu +{ + public class AssetWelcomeWindow : EditorWindow + { + private static Texture2D _icon; + + public static void ShowWindow() + { + _icon = Resources.Load("SSGI UI Card"); + + var window = GetWindow("Welcome"); + + Vector2 minSize = new Vector2(600, 240); + + if (HExtensions.IsUnityLTS(Application.unityVersion)) + minSize.y -= 45; + + if (_icon != null) + minSize.y += 100; + + Vector2 maxSize = minSize - new Vector2(1, 1); + window.minSize = minSize; + window.maxSize = maxSize; + + Rect main = EditorGUIUtility.GetMainWindowPosition(); + window.position = new Rect( + main.x + (main.width - minSize.x) / 2, + main.y + (main.height - minSize.y) / 2, + minSize.x, + minSize.y + ); + } + + private void OnGUI() + { + if (_icon != null) + { + GUILayout.Space(5); + Rect rect = GUILayoutUtility.GetAspectRect((float)_icon.width / _icon.height); + rect.xMin += 4; + rect.xMax -= 4; + GUI.DrawTexture(rect, _icon, ScaleMode.ScaleToFit); + EditorGUILayout.Space(5f); + } + + GUILayout.Space(5); + + GUILayout.Label($"Thank you for purchasing {HNames.ASSET_NAME_FULL_WITH_DOTS}!", EditorStyles.boldLabel); + GUILayout.Space(5); + + DrawUnityVersionWarning(); + + GUILayout.Space(10); + + var richLabel = new GUIStyle(EditorStyles.wordWrappedLabel) + { + richText = true + }; + GUILayout.Label( + "Please make sure to read the Documentation before using the asset.\n" + + "If you run into any issues, check the Known Issues and FAQ sections before reporting a bug.", + richLabel + ); + GUILayout.Space(5); + + DrawLinksLine(); + + GUILayout.Space(10); + GUILayout.Label( + "Shortcuts to the Documentation, Discord support channel, and Bug Report form " + + "can be found at the bottom of the HTrace UI.", + EditorStyles.wordWrappedLabel + ); + + GUILayout.Space(15); + + bool dontShow = GUILayout.Toggle( + EditorPrefs.GetBool(HNames.HTRACE_SHOW_KEY, false), + "Don't show next time" + ); + + EditorPrefs.SetBool(HNames.HTRACE_SHOW_KEY, dontShow); + + GUILayout.Space(10); + + if (GUILayout.Button("I understand, close window")) + { + Close(); + } + } + private static void DrawUnityVersionWarning() + { + string unityVersion = Application.unityVersion; + + if (!HExtensions.IsUnityLTS(unityVersion)) + { + EditorGUILayout.HelpBox( + $"The current Unity version ({unityVersion}) is not an LTS release.\n" + + "Bug fixes for non-LTS releases are not guaranteed.", + MessageType.Warning + ); + } + } + + private static void DrawLinksLine() + { + EditorGUILayout.BeginHorizontal(); + + DrawLinkButton("Documentation", HNames.HTRACE_SSGI_DOCUMENTATION_LINK); + GUILayout.Label("|", GUILayout.Width(10)); + DrawLinkButton("Known Issues", HNames.HTRACE_SSGI_DOCUMENTATION_LINK_KNOWN_ISSUES); + GUILayout.Label("|", GUILayout.Width(10)); + DrawLinkButton("FAQ", HNames.HTRACE_SSGI_DOCUMENTATION_LINK_FAQ); + + EditorGUILayout.EndHorizontal(); + } + + private static void DrawLinkButton(string label, string url) + { + var style = new GUIStyle(EditorStyles.linkLabel) + { + wordWrap = false + }; + + if (GUILayout.Button(label, style, GUILayout.Width(EditorStyles.linkLabel.CalcSize(new GUIContent(label)).x))) + { + Application.OpenURL(url); + } + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs.meta new file mode 100644 index 0000000..a0666fc --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 37241604af0a4e2ea194f52d530a3b97 +timeCreated: 1766077786 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/WindowsAndMenu/AssetWelcomeWindow.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs new file mode 100644 index 0000000..8856e8c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs @@ -0,0 +1,98 @@ +using HTraceSSGI.Scripts.Globals; +using UnityEngine; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace HTraceSSGI.Scripts.Editor.WindowsAndMenu +{ +#if UNITY_EDITOR + public class HBugReporterWindow : EditorWindow + { + private string _reportData = ""; + + private GUIStyle _styleLabel; + private Vector2 _scrollPosition = Vector2.zero; + + [MenuItem("Window/HTrace/Report a Bug HTrace SSGI", false, priority: 32)] + public static void ShowWindow() + { + var window = GetWindow(false, "Report Bug", true); + window.minSize = new Vector2(400, 330); + } + + void OnEnable() + { + _reportData = ""; + + var pipeline = HRenderer.CurrentHRenderPipeline.ToString(); + + _reportData += $"{HNames.ASSET_NAME_FULL} Version: {HNames.HTRACE_SSGI_VERSION}" + "\n"; + + _reportData += "\n"; + + _reportData += "Unity Version: " + Application.unityVersion + "\n"; + _reportData += "Pipeline: " + pipeline + "\n"; + _reportData += "Platform: " + Application.platform + "\n"; + _reportData += "Graphics API: " + SystemInfo.graphicsDeviceType + "\n"; + + _reportData += "\n"; + + _reportData += "OS: " + SystemInfo.operatingSystem + "\n"; + _reportData += "Graphics: " + SystemInfo.graphicsDeviceName + "\n"; + + _reportData += "\n"; + _reportData += "Additional details:\n"; + } + + void OnGUI() + { + SetGUIStyles(); + + GUILayout.Space(-2); + + GUILayout.BeginHorizontal(); + GUILayout.Space(15); + + GUILayout.BeginVertical(); + + _scrollPosition = GUILayout.BeginScrollView(_scrollPosition, false, false, GUILayout.Width(this.position.width - 28), GUILayout.Height(this.position.height - 80)); + + GUILayout.Label(_reportData, _styleLabel); + + GUILayout.Space(15); + + if (GUILayout.Button("Copy Details To Clipboard", GUILayout.Height(24))) + { + var copyData = _reportData; + + GUIUtility.systemCopyBuffer = copyData; + } + if (GUILayout.Button("Report Bug on Discord", GUILayout.Height(24))) + { + Application.OpenURL(HNames.HTRACE_DISCORD_BUGS_SSGI_LINK); + } + + GUILayout.FlexibleSpace(); + + GUILayout.Space(20); + + GUILayout.EndScrollView(); + + GUILayout.EndVertical(); + + GUILayout.Space(13); + GUILayout.EndHorizontal(); + } + + void SetGUIStyles() + { + _styleLabel = new GUIStyle(EditorStyles.label) + { + richText = true, + }; + } + } + +#endif +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs.meta new file mode 100644 index 0000000..5faec78 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: dba5cecf144f410fb38b07e1de8c0ca1 +timeCreated: 1757344409 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HBugReporterWindow.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs new file mode 100644 index 0000000..5aee484 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs @@ -0,0 +1,52 @@ +//pipelinedefine +#define H_URP + +#if UNITY_EDITOR +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using UnityEditor; +using UnityEditor.ShortcutManagement; +using UnityEngine; +using HTraceSSGI.Scripts.Infrastructure.URP; + +namespace HTraceSSGI.Scripts.Editor.WindowsAndMenu +{ + +#if UNITY_EDITOR + + public class HMenuAndFilesManager : EditorWindow + { + [MenuItem("GameObject/Rendering/HTrace Screen Space Global Illumination", false, priority: 30)] + static void CreateHTraceGameObject(MenuCommand menuCommand) + { + HTraceSSGI[] hTraces = FindObjectsOfType(typeof(HTraceSSGI)) as HTraceSSGI[]; + if (hTraces != null && hTraces.Length > 0) + { + return; + } + + GameObject go = new GameObject(HNames.ASSET_NAME); + GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject); + go.AddComponent(); + + Undo.RegisterCreatedObjectUndo(go, "Create " + go.name); + Selection.activeObject = go; + } + + [MenuItem("Window/HTrace/Add HTrace SSGI Render Feature to active RendererData", false, priority: 32)] + private static void AddRenderFeature() + { + HRendererURP.AddHTraceRendererFeatureToUniversalRendererData(); + } + + [MenuItem("Window/HTrace/Open HTrace SSGI documentation", false, priority: 32)] + private static void OpenDocumentation() + { + Application.OpenURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK); + } + } + +#endif +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs.meta new file mode 100644 index 0000000..a919b56 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4097973eb33709247ad51c90310a5018 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Editor/WindowsAndMenu/HMenuAndFilesManager.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions.meta new file mode 100644 index 0000000..d1b2767 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7c37931430e142a8a8c9147d0094a187 +timeCreated: 1756743171 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem.meta new file mode 100644 index 0000000..72fefa5 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2ce18ebb0d794317835a43506e011560 +timeCreated: 1756743209 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs new file mode 100644 index 0000000..8dd9a6a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs @@ -0,0 +1,71 @@ +using System; + +namespace HTraceSSGI.Scripts.Extensions.CameraHistorySystem +{ + public class CameraHistorySystem where T : struct, ICameraHistoryData + { + private const int MaxCameraCount = 4; // minimum 2 + + private int _cameraHistoryIndex; + private readonly T[] _cameraHistoryData = new T[MaxCameraCount]; + + + public int UpdateCameraHistoryIndex(int currentCameraHash) + { + _cameraHistoryIndex = GetCameraHistoryDataIndex(currentCameraHash); + return _cameraHistoryIndex; + } + + private int GetCameraHistoryDataIndex(int cameraHash) + { + // Unroll manually for MAX_CAMERA_COUNT = 4 + if (_cameraHistoryData[0].GetHash() == cameraHash) return 0; + if (_cameraHistoryData[1].GetHash() == cameraHash) return 1; + if (_cameraHistoryData[2].GetHash() == cameraHash) return 2; + if (_cameraHistoryData[3].GetHash() == cameraHash) return 3; + return -1; // new camera + } + + public void UpdateCameraHistoryData() + { + bool cameraHasChanged = _cameraHistoryIndex == -1; + + if (cameraHasChanged) + { + const int lastIndex = MaxCameraCount - 1; + + if (_cameraHistoryData[lastIndex] is IDisposable disposable) + disposable.Dispose(); + + // Shift the camera history data back by one + Array.Copy(_cameraHistoryData, 0, _cameraHistoryData, 1, lastIndex); + + _cameraHistoryIndex = 0; + _cameraHistoryData[0] = new T(); //it's critical + } + } + + public ref T GetCameraData() + { + return ref _cameraHistoryData[_cameraHistoryIndex]; + } + + public T[] GetCameraDatas() + { + return _cameraHistoryData; + } + + public void SetCameraData(T data) + { + _cameraHistoryData[_cameraHistoryIndex] = data; + } + + public void Cleanup() + { + for (int index = 0; index < _cameraHistoryData.Length; index++) + { + _cameraHistoryData[index] = default; + } + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs.meta new file mode 100644 index 0000000..0ebb99a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c3e05482e5474c74ac2640b07596bc39 +timeCreated: 1756743219 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/CameraHistorySystem.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs new file mode 100644 index 0000000..7540cfb --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs @@ -0,0 +1,8 @@ +namespace HTraceSSGI.Scripts.Extensions.CameraHistorySystem +{ + public interface ICameraHistoryData + { + int GetHash(); + void SetHash(int hashIn); + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs.meta new file mode 100644 index 0000000..efbc64b --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0c7d445abdf7490a9ce172328c1955e4 +timeCreated: 1756743242 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Extensions/CameraHistorySystem/ICameraHistoryData.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs new file mode 100644 index 0000000..da7c861 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs @@ -0,0 +1,32 @@ +//pipelinedefine +#define H_URP + +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Experimental.Rendering; + +using UnityEngine.Rendering.Universal; +#if UNITY_2023_3_OR_NEWER +using UnityEngine.Rendering.RenderGraphModule; +#endif + +namespace HTraceSSGI.Scripts.Extensions +{ + public class ExtensionsURP + { +#if UNITY_2023_3_OR_NEWER + public static TextureHandle CreateTexture(string name, RenderGraph rg, ref TextureDesc desc, GraphicsFormat format, DepthBits depthBufferBits = DepthBits.None, + bool enableRandomWrite = true, bool useMipMap = false, bool autoGenerateMips = false) + { + desc.name = name; + desc.format = format; + desc.depthBufferBits = depthBufferBits; + desc.enableRandomWrite = enableRandomWrite; + desc.useMipMap = useMipMap; + desc.autoGenerateMips = autoGenerateMips; + desc.msaaSamples = MSAASamples.None; + return rg.CreateTexture(desc); + } +#endif //UNITY_2023_3_OR_NEWER + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs.meta new file mode 100644 index 0000000..f15b37e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: dac8d0f9113f40878aad789181576a57 +timeCreated: 1757339719 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Extensions/ExtensionsURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs new file mode 100644 index 0000000..ad7ea34 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs @@ -0,0 +1,261 @@ +//pipelinedefine +#define H_URP + +using System; +using System.Reflection; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Wrappers; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; +#if UNITY_2021 || UNITY_2022 +using UnityEngine.Experimental.Rendering; +#endif + +namespace HTraceSSGI.Scripts.Extensions +{ + + public static class HExtensions + { + public static void DebugPrint(DebugType type, string msg) + { + msg = "HTrace log: " + msg; + + switch (type) + { + case DebugType.Log: + Debug.Log(msg); + break; + case DebugType.Warning: + Debug.LogWarning(msg); + break; + case DebugType.Error: + Debug.LogError(msg); + break; + } + } + + public static ComputeShader LoadComputeShader(string shaderName) + { + var computeShader = (ComputeShader)UnityEngine.Resources.Load($"HTraceSSGI/Computes/{shaderName}"); + if (computeShader == null) + { + Debug.LogError($"{shaderName} is missing in HTraceSSGI/Computes folder"); + return null; + } + + return computeShader; + } + + public static RayTracingShader LoadRayTracingShader(string shaderName) + { + var rtShader = (RayTracingShader)UnityEngine.Resources.Load($"HTraceSSGI/Computes/{shaderName}"); + if (rtShader == null) + { + Debug.LogError($"{shaderName} is missing in HTraceSSGI/Computes folder"); + return null; + } + + return rtShader; + } + + public static bool ContainsOnOfElement(this string str, string[] elements) + { + foreach (var element in elements) + { + if (str.Contains(element)) + return true; + } + return false; + } + + public static T NextEnum(this T src) where T : struct + { + if (!typeof(T).IsEnum) throw new ArgumentException(String.Format("Argument {0} is not an Enum", typeof(T).FullName)); + + T[] Arr = (T[])Enum.GetValues(src.GetType()); + int j = Array.IndexOf(Arr, src) + 1; + src = (Arr.Length == j) ? Arr[0] : Arr[j]; + return src; + } + + public static bool IsUnityLTS(string version) + { + // 2023.1.5f1 + if (!Version.TryParse(GetNumericVersion(version), out var current)) + return false; + + return + current >= new Version(6000, 3, 0) && current < new Version(6000, 3, 100) || + current >= new Version(6000, 0, 23) && current < new Version(6000, 0, 100) || + current >= new Version(2022, 3, 0) && current < new Version(2022, 3, 100) || + current >= new Version(2023, 1, 0) && current < new Version(2023, 1, 100) || + current >= new Version(2023, 2, 0) && current < new Version(2023, 2, 100); + } + + private static string GetNumericVersion(string version) + { + int index = version.IndexOfAny(new[] { 'f', 'a', 'b' }); + return index > 0 ? version.Substring(0, index) : version; + } + + //custom Attributes +#if UNITY_EDITOR + + /// + /// Read Only attribute. + /// Attribute is use only to mark ReadOnly properties. + /// + public class ReadOnlyAttribute : PropertyAttribute + { + } + + /// + /// This class contain custom drawer for ReadOnly attribute. + /// + [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] + public class ReadOnlyDrawer : PropertyDrawer + { + /// + /// Unity method for drawing GUI in Editor + /// + /// Position. + /// Property. + /// Label. + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + // Saving previous GUI enabled value + var previousGUIState = GUI.enabled; + // Disabling edit for property + GUI.enabled = false; + // Drawing Property + EditorGUI.PropertyField(position, property, label); + // Setting old GUI enabled value + GUI.enabled = previousGUIState; + } + } +#endif + + /// + /// Attribute used to make a float or int variable in a script be restricted to a specific range. + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + public class HRangeAttribute : Attribute + { + public readonly bool isFloat; + + public readonly float minFloat; + public readonly float maxFloat; + public readonly int minInt; + public readonly int maxInt; + + /// + /// Attribute used to make a float or int variable in a script be restricted to a specific range. + /// + /// The minimum allowed value. + /// The maximum allowed value. + public HRangeAttribute(float minFloat, float maxFloat) + { + this.minFloat = minFloat; + this.maxFloat = maxFloat; + isFloat = true; + } + + /// + /// Attribute used to make a float or int variable in a script be restricted to a specific range. + /// + /// The minimum allowed value. + /// The maximum allowed value. + public HRangeAttribute(int minInt, int maxInt) + { + this.minInt = minInt; + this.maxInt = maxInt; + isFloat = false; + } + } + + public struct HRangeAttributeElement + { + public bool isFloat; + public float minFloat; + public float maxFloat; + public int minInt; + public int maxInt; + } + + public static float Clamp(float value, Type type, string nameOfField) + { + HRangeAttribute rangeAttribute = null; + + var filed = type.GetField(nameOfField); + if (filed != null) + { + rangeAttribute = filed.GetCustomAttribute(); + } + var property = type.GetProperty(nameOfField); + if (property != null) + { + rangeAttribute = property.GetCustomAttribute(); + } + + return Mathf.Clamp(value, rangeAttribute.minFloat, rangeAttribute.maxFloat); + } + + public static int Clamp(int value, Type type, string nameOfField) + { + HRangeAttribute rangeAttribute = null; + + var filed = type.GetField(nameOfField); + if (filed != null) + { + rangeAttribute = filed.GetCustomAttribute(); + } + var property = type.GetProperty(nameOfField); + if (property != null) + { + rangeAttribute = property.GetCustomAttribute(); + } + + return Mathf.Clamp(value, rangeAttribute.minInt, rangeAttribute.maxInt); + } + + public static void HRelease(this ComputeBuffer computeBuffer) + { + if (computeBuffer != null) + computeBuffer.Release(); + } + + public static void HRelease(this CommandBuffer commandBuffer) + { + if (commandBuffer != null) + { + commandBuffer.Clear(); + commandBuffer.Release(); + } + } + + public static void HRelease(this GraphicsBuffer graphicsBuffer) + { + if (graphicsBuffer != null) + { + graphicsBuffer.Release(); + } + } + + public static void HRelease(this HDynamicBuffer hDynamicBuffer) + { + if (hDynamicBuffer != null) + { + hDynamicBuffer.Release(); + } + } + + public static void HRelease(this RayTracingAccelerationStructure rayTracingAccelerationStructure) + { + if (rayTracingAccelerationStructure != null) + { + rayTracingAccelerationStructure.Release(); + } + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs.meta new file mode 100644 index 0000000..82184ab --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/HExtensions.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b25052d2c30a3664f886c0a9848fdc72 +timeCreated: 1659691524 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Extensions/HExtensions.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs new file mode 100644 index 0000000..24c396f --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs @@ -0,0 +1,7 @@ +namespace HTraceSSGI.Scripts.Extensions +{ + public interface IHistoryData + { + void Update(); + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs.meta new file mode 100644 index 0000000..ee7a7af --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Extensions/IHistoryData.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 09c7949fa72d433aa944d9be383f2372 +timeCreated: 1757489511 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Extensions/IHistoryData.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals.meta new file mode 100644 index 0000000..72cc344 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 03f7f99440026054c98bc8c2d855fe55 +timeCreated: 1728989246 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs new file mode 100644 index 0000000..d69f547 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs @@ -0,0 +1,71 @@ +//pipelinedefine +#define H_URP + +using UnityEngine.Rendering; + +namespace HTraceSSGI.Scripts.Globals +{ + public enum ThicknessMode + { + Relative = 0, + Uniform, + } + + public enum FallbackType + { + None = 0, + Sky = 1, + +#if UNITY_6000_0_OR_NEWER + APV = 2, +#endif + } + + public enum BrightnessClamp + { + Manual = 0, + Automatic = 1, + } + + public enum ReprojectionFilter + { + Linear4Taps = 0, + Lanczos12Taps = 1, + } + + public enum AlphaCutout + { + Evaluate = 0, + DepthTest = 1, + } + + public enum DebugMode + { + None = 0, + MainBuffers = 1, + DirectLighting = 2, + GlobalIllumination = 3, + TemporalDisocclusion = 4, + } + + public enum HBuffer + { + Multi, + Depth, + Diffuse, + Normal, + MotionMask, + MotionVectors, + } + + public enum HInjectionPoint + { + } + + public enum DebugType + { + Log, + Warning, + Error, + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs.meta new file mode 100644 index 0000000..6de2757 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HEnums.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 597ae110d1b52354ba4a3f4c6452b96e +timeCreated: 1661865051 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Globals/HEnums.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs new file mode 100644 index 0000000..06e4c87 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs @@ -0,0 +1,183 @@ +using UnityEngine; + +namespace HTraceSSGI.Scripts.Globals +{ + public static class HMath + { + private static Vector2 RemapVoxelsCoeff = new Vector2(64f, 512f); //min - 64 VoxelResolution, max - 512 VoxelResolution + + /// + /// Remap from one range to another + /// + /// + /// + /// + /// + /// + /// + public static float Remap(float input, float oldLow, float oldHigh, float newLow, float newHigh) + { + float t = Mathf.InverseLerp(oldLow, oldHigh, input); + return Mathf.Lerp(newLow, newHigh, t); + } + + // public static float RemapThickness(float thickness, ThicknessMode thicknessMode) + // { + // float result = 0f; + // switch (thicknessMode) + // { + // case ThicknessMode.Standard: + // result = Remap(thickness, 0f, 1f, 0f, 0.15f); + // break; + // case ThicknessMode.Accurate: + // result = Remap(thickness, 0f, 1f, 0f, 0.05f); + // break; + // default: + // Debug.LogError($"RemapThickness ERROR: thickness: {thickness}, ThicknessMode: {thicknessMode}"); + // break; + // } + // + // return result; + // } + + /// + /// Thickness value pre-calculation for GI + /// + /// + /// + /// + public static Vector2 ThicknessBias(float baseThickness, Camera camera) + { + baseThickness = Remap(baseThickness, 0f, 1f, 0f, 0.5f); + float n = camera.nearClipPlane; + float f = camera.farClipPlane; + float thicknessScale = 1.0f / (1.0f + baseThickness); + float thicknessBias = -n / (f - n) * (baseThickness * thicknessScale); + return new Vector2((float)thicknessScale, (float)thicknessBias); + } + + public static Vector4 ComputeViewportScaleAndLimit(Vector2Int viewportSize, Vector2Int bufferSize) + { + return new Vector4(ComputeViewportScale(viewportSize.x, bufferSize.x), // Scale(x) + ComputeViewportScale(viewportSize.y, bufferSize.y), // Scale(y) + ComputeViewportLimit(viewportSize.x, bufferSize.x), // Limit(x) + ComputeViewportLimit(viewportSize.y, bufferSize.y)); // Limit(y) + } + + public static float PixelSpreadTangent(float Fov, int Width, int Height) + { + return Mathf.Tan(Fov * Mathf.Deg2Rad * 0.5f) * 2.0f / Mathf.Min(Width, Height); + } + + public static float CalculateVoxelSizeInCM_UI(int bounds, float density) + { + float resolution = Mathf.CeilToInt(bounds / (bounds / HMath.Remap(density, 0f, 1f, HMath.RemapVoxelsCoeff.x, HMath.RemapVoxelsCoeff.y))); + return bounds / resolution * 100f; //100 -> cm + } + + public static float TexturesSizeInMB_UI(int voxelBounds, float density, bool overrideGroundEnable, int GroundLevel) + { + float resolution = voxelBounds / (voxelBounds / HMath.Remap(density, 0f, 1f, HMath.RemapVoxelsCoeff.x, HMath.RemapVoxelsCoeff.y)); + float voxelSize = voxelBounds / resolution; + float textureResolution = resolution * resolution; + textureResolution *= overrideGroundEnable == true ? (GroundLevel / voxelSize) : resolution; + float colorMemorySize = textureResolution * 32 / (1024 * 1024 * 8); + float positionMemorySize = (textureResolution * 32 / (1024 * 1024 * 8)) + (textureResolution * 8 / (1024 * 1024 * 8)); + + return colorMemorySize + positionMemorySize; + } + + public static float TexturesSizeInMB_UI(Vector3Int voxelsRelosution) + { + float textureResolution = voxelsRelosution.x * voxelsRelosution.y * voxelsRelosution.z; + float colorMemorySize = textureResolution * 32 / (1024 * 1024 * 8); + float positionMemorySize = (textureResolution * 32 / (1024 * 1024 * 8)) + (textureResolution * 8 / (1024 * 1024 * 8)); + + return colorMemorySize + positionMemorySize; + } + + public static Vector3Int CalculateVoxelResolution_UI(int voxelBounds, float density, bool overrideGroundEnable, int GroundLevel) + { + Vector3Int resolutionResult = new Vector3Int(); + float resolution = HMath.Remap(density, 0f, 1f, HMath.RemapVoxelsCoeff.x, HMath.RemapVoxelsCoeff.y); + resolutionResult.x = Mathf.CeilToInt(resolution); + resolutionResult.y = Mathf.CeilToInt(resolution); + + float height = (overrideGroundEnable == false ? voxelBounds : GroundLevel); + resolutionResult.z = Mathf.CeilToInt(height / (voxelBounds / resolution)); + + resolutionResult.x = HMath.DevisionBy4(resolutionResult.x); + resolutionResult.y = HMath.DevisionBy4(resolutionResult.y); + resolutionResult.z = HMath.DevisionBy4(resolutionResult.z); + + return resolutionResult; + } + + public static Vector3 Truncate(this Vector3 input, int digits) + { + return new Vector3(input.x.RoundTail(digits), input.y.RoundTail(digits), input.z.RoundTail(digits)); + } + + public static Vector3 Ceil(this Vector3 input, int digits) + { + return new Vector3(input.x.RoundToCeilTail(digits), input.y.RoundToCeilTail(digits), input.z.RoundToCeilTail(digits)); + } + + public static float RoundTail(this float value, int digits) + { + float mult = Mathf.Pow(10.0f, digits); + float result = Mathf.Round(mult * value) / mult; + return result; + } + + public static float RoundToCeilTail(this float value, int digits) + { + float mult = Mathf.Pow(10.0f, digits); + float result = Mathf.Ceil(mult * value) / mult; + return result; + } + + public static Vector2Int CalculateDepthPyramidResolution(Vector2Int screenResolution, int lowestMipLevel) + { + int lowestMipScale = (int)Mathf.Pow(2.0f, lowestMipLevel); + Vector2Int lowestMipResolutiom = new Vector2Int(Mathf.CeilToInt( (float)screenResolution.x / (float)lowestMipScale), + Mathf.CeilToInt( (float)screenResolution.y / (float)lowestMipScale)); + + Vector2Int paddedDepthPyramidResolution = lowestMipResolutiom * lowestMipScale; + return paddedDepthPyramidResolution; + } + + public static int CalculateStepCountSSGI(float giRadius, float giAccuracy) + { + if (giRadius <= 25.0f) + { + //5 -> 16, 10 -> 20, 25 -> 25 + return Mathf.FloorToInt((-0.0233f * giRadius * giRadius + 1.15f * giRadius + 10.833f) * giAccuracy); + } + + //50 -> 35, 100 -> 50, 150 -> 64 + return Mathf.FloorToInt((-0.0002f * giRadius * giRadius + 0.33f * giRadius + 19f) * giAccuracy); + } + + private static int DevisionBy4(int value) + { + return value % 4 == 0 ? value : DevisionBy4(value + 1); + } + + private static float ComputeViewportScale(int viewportSize, int bufferSize) + { + float rcpBufferSize = 1.0f / bufferSize; + + // Scale by (vp_dim / buf_dim). + return viewportSize * rcpBufferSize; + } + + private static float ComputeViewportLimit(int viewportSize, int bufferSize) + { + float rcpBufferSize = 1.0f / bufferSize; + + // Clamp to (vp_dim - 0.5) / buf_dim. + return (viewportSize - 0.5f) * rcpBufferSize; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs.meta new file mode 100644 index 0000000..65dcbf6 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HMath.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 120dbec02a6a0a4439d6623081e5ed7b +timeCreated: 1661871568 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Globals/HMath.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs new file mode 100644 index 0000000..64b81f5 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs @@ -0,0 +1,32 @@ +namespace HTraceSSGI.Scripts.Globals +{ + internal static class HNames + { + public const string ASSET_NAME = "HTraceSSGI"; + public const string ASSET_NAME_FULL = "HTrace Screen Space Global Illumination"; + public const string ASSET_NAME_FULL_WITH_DOTS = "HTrace: Screen Space Global Illumination"; + public const string HTRACE_SSGI_DOCUMENTATION_LINK = "https://ipgames.gitbook.io/htrace-ssgi"; + public const string HTRACE_SSGI_DOCUMENTATION_LINK_KNOWN_ISSUES = "https://ipgames.gitbook.io/htrace-ssgi/known-issues"; + public const string HTRACE_SSGI_DOCUMENTATION_LINK_FAQ = "https://ipgames.gitbook.io/htrace-ssgi/frequently-asked-questions"; + public const string HTRACE_DISCORD_LINK = "https://discord.com/invite/Nep56Efu7A"; + public const string HTRACE_DISCORD_BUGS_SSGI_LINK = "https://discord.gg/4FN9wsYt5T"; + public const string HTRACE_SSGI_VERSION = "1.2.0"; + + //Prefs + public const string HTRACE_SHOW_KEY = "HTraceSSGI_ShowWelcomeWindow"; + public const string HTRACE_WELCOME_SHOW_SESSION = "HTraceSSGI_ShowWelcomeWindowSessions"; + public const string HTRACE_UNITY_VERSION_KEY = "HTraceSSGI_UnityVersion"; + + // ---------------- Profiling ---------------- + public const string HTRACE_PRE_PASS_NAME = "HTraceSSGI Pre Pass"; + public const string HTRACE_MV_PASS_NAME = "HTraceSSGI Motion Vectors Pass"; + public const string HTRACE_OBJECTS_MV_PASS_NAME = "HTraceSSGI Objects Motion Vectors Pass"; + public const string HTRACE_CAMERA_MV_PASS_NAME = "HTraceSSGI Camera Motion Vectors Pass"; + public const string HTRACE_GBUFFER_PASS_NAME = "HTraceSSGI GBuffer Pass"; + public const string HTRACE_SSGI_PASS_NAME = "HTraceSSGI SSGI Pass"; + public const string HTRACE_FINAL_PASS_NAME = "HTraceSSGI Final Pass"; + + public const string KEYWORD_SWITCHER = "HTRACEGI_OVERRIDE"; + //public const string INT_SWITCHER = "_HTRACE_INT_OVERRIDE"; + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs.meta new file mode 100644 index 0000000..ba3c538 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HNames.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5a739df963d4e354f8d13ac9e5e6ee44 +timeCreated: 1691582446 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Globals/HNames.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs new file mode 100644 index 0000000..095deb6 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs @@ -0,0 +1,135 @@ +//pipelinedefine +#define H_URP + +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; +using HTraceSSGI.Scripts.Infrastructure.URP; +using UnityEngine.Rendering.Universal; + +namespace HTraceSSGI.Scripts.Globals +{ + public enum HRenderPipeline + { + None, + BIRP, + URP, + HDRP + } + + public static class HRenderer + { + static HRenderPipeline s_CurrentHRenderPipeline = HRenderPipeline.None; + + public static HRenderPipeline CurrentHRenderPipeline + { + get + { + if (s_CurrentHRenderPipeline == HRenderPipeline.None) + { + s_CurrentHRenderPipeline = GetRenderPipeline(); + } + return s_CurrentHRenderPipeline; + } + } + + private static HRenderPipeline GetRenderPipeline() + { + if (GraphicsSettings.currentRenderPipeline) + { + if (GraphicsSettings.currentRenderPipeline.GetType().ToString().Contains("HighDefinition")) + return HRenderPipeline.HDRP; + else + return HRenderPipeline.URP; + } + + return HRenderPipeline.BIRP; + } + + public static bool SupportsInlineRayTracing + { + get + { + #if UNITY_2023_1_OR_NEWER + return SystemInfo.supportsInlineRayTracing; + #else + return false; + #endif + } + } + + public static bool SupportsRayTracing + { + get + { + #if UNITY_2023_1_OR_NEWER // TODO: revert this to 2019 when raytracing issue in 2022 is resolved + if (SystemInfo.supportsRayTracing == false) + return false; + + + return true; + #else + return false; + #endif + } + } + + + public static int TextureXrSlices + { + get + { + if (Application.isPlaying == false) + return 1; + + + return 1; + } + } + + static RenderTexture emptyTexture; + public static RenderTexture EmptyTexture + { + get + { + if (emptyTexture == null) + { + emptyTexture = new RenderTexture(4, 4, 0); + emptyTexture.enableRandomWrite = true; + emptyTexture.dimension = TextureDimension.Tex2D; + emptyTexture.format = RenderTextureFormat.ARGBFloat; + emptyTexture.Create(); + } + + return emptyTexture; + } + } + + private static Mesh _fullscreenTriangle; + public static Mesh FullscreenTriangle + { + get + { + if (_fullscreenTriangle != null) + return _fullscreenTriangle; + + _fullscreenTriangle = new Mesh { name = "Fullscreen Triangle" }; + + // Because we have to support older platforms (GLES2/3, DX9 etc) we can't do all of + // this directly in the vertex shader using vertex ids :( + _fullscreenTriangle.SetVertices(new List + { + new Vector3(-1f, -1f, 0f), + new Vector3(-1f, 3f, 0f), + new Vector3( 3f, -1f, 0f) + }); + _fullscreenTriangle.SetIndices(new[] { 0, 1, 2 }, MeshTopology.Triangles, 0, false); + _fullscreenTriangle.UploadMeshData(false); + + return _fullscreenTriangle; + } + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs.meta new file mode 100644 index 0000000..dffe269 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRenderer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 360412b93660c734f943ed19ba9c2e52 +timeCreated: 1727432136 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Globals/HRenderer.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs new file mode 100644 index 0000000..f93647f --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs @@ -0,0 +1,264 @@ +//pipelinedefine +#define H_URP + +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using UnityEngine.Rendering; +using HTraceSSGI.Scripts.Infrastructure.URP; +using UnityEditor; +using UnityEngine.Rendering.Universal; + +namespace HTraceSSGI.Scripts.Globals +{ + public static class HRendererURP + { + public static bool RenderGraphEnabled + { + get + { +#if UNITY_2023_3_OR_NEWER + return GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode == false; +#endif + return false; + } + } + + public static UniversalRenderPipelineAsset UrpAsset => + GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset urpAsset ? urpAsset : null; + +#if UNITY_EDITOR + private static FieldInfo s_rendererDataListFieldInfo; + private static FieldInfo s_defaultRendererIndexFieldInfo; + + private static ScriptableRendererData[] GetRendererDataList() + { + var urpAsset = UrpAsset; + if (urpAsset == null) + return null; + + try + { + if (s_rendererDataListFieldInfo == null) + s_rendererDataListFieldInfo = typeof(UniversalRenderPipelineAsset) + .GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic); + + if (s_rendererDataListFieldInfo == null) + return null; + + return (ScriptableRendererData[])s_rendererDataListFieldInfo.GetValue(urpAsset); + } + catch (Exception e) + { + Debug.LogError($"Failed to get renderer data list: {e.Message}"); + return null; + } + } + + private static int GetDefaultRendererIndex() + { + var urpAsset = UrpAsset; + if (urpAsset == null) + return -1; + + try + { + if (s_defaultRendererIndexFieldInfo == null) + s_defaultRendererIndexFieldInfo = typeof(UniversalRenderPipelineAsset) + .GetField("m_DefaultRendererIndex", BindingFlags.Instance | BindingFlags.NonPublic); + + if (s_defaultRendererIndexFieldInfo == null) + return -1; + + return (int)s_defaultRendererIndexFieldInfo.GetValue(urpAsset); + } + catch (Exception e) + { + Debug.LogError($"Failed to get default renderer index: {e.Message}"); + return -1; + } + } + + public static UniversalRendererData UniversalRendererData => GetUniversalRendererData(); + + /// + /// Get UniversalRendererData by index or default + /// + /// Renderer index. If -1 - than default + /// + private static UniversalRendererData GetUniversalRendererData(int rendererIndex = -1) + { + var rendererDataList = GetRendererDataList(); + if (rendererDataList == null || rendererDataList.Length == 0) + return null; + + if (rendererIndex == -1) rendererIndex = GetDefaultRendererIndex(); + + // Index validation + if (rendererIndex < 0 || rendererIndex >= rendererDataList.Length) + { + Debug.LogWarning( + $"Invalid renderer index {rendererIndex}. Available renderers: {rendererDataList.Length}"); + return null; + } + + return rendererDataList[rendererIndex] as UniversalRendererData; + } + + public static bool IsSsaoNativeEnabled() + { + return HasRendererFeatureByTypeName("ScreenSpaceAmbientOcclusion"); + } + + private static bool HasRendererFeatureByTypeName(string typeName, int rendererIndex = -1) + { + return GetRendererFeatureByTypeName(typeName, rendererIndex) != null; + } + + public static ScriptableRendererFeature GetRendererFeatureByTypeName(string typeName, int rendererIndex = -1) + { + var rendererDataList = GetRendererDataList(); + if (rendererDataList == null || rendererDataList.Length == 0) + return null; + + var renderersToSearch = new List(); + + if (rendererIndex >= 0 && rendererIndex < rendererDataList.Length) + renderersToSearch.Add(rendererDataList[rendererIndex]); + else + renderersToSearch.AddRange(rendererDataList); + + foreach (var rendererData in renderersToSearch) + { + if (rendererData?.rendererFeatures == null) continue; + + foreach (var feature in rendererData.rendererFeatures) + { + if (feature == null) continue; + + if (feature.GetType().Name.Contains(typeName, StringComparison.OrdinalIgnoreCase)) return feature; + } + } + + return null; + } + + public static T GetRendererFeature(int rendererIndex = -1) where T : ScriptableRendererFeature + { + var rendererDataList = GetRendererDataList(); + if (rendererDataList == null || rendererDataList.Length == 0) + return null; + + var renderersToSearch = new List(); + + if (rendererIndex >= 0 && rendererIndex < rendererDataList.Length) + renderersToSearch.Add(rendererDataList[rendererIndex]); + else + renderersToSearch.AddRange(rendererDataList); + + foreach (var rendererData in renderersToSearch) + { + if (rendererData?.rendererFeatures == null) continue; + + foreach (var feature in rendererData.rendererFeatures) + if (feature is T typedFeature) + return typedFeature; + } + + return null; + } + + private static bool ContainsRenderFeature(List features, string name) + { + if (features == null) return false; + + for (var i = 0; i < features.Count; i++) + if (features[i]?.name == name) + return true; + return false; + } + + public static void AddHTraceRendererFeatureToUniversalRendererData() + { + var universalRendererData = UniversalRendererData; + if (universalRendererData?.rendererFeatures == null) + { + Debug.LogWarning("Universal Renderer Data not found or has no features list"); + return; + } + + var features = universalRendererData.rendererFeatures; + + CleanupRendererFeatures(features); + + if (!ContainsRenderFeature(features, nameof(HTraceSSGIRendererFeature))) + AddHTraceRendererFeature(universalRendererData, features); + + universalRendererData.SetDirty(); + } + + private static void CleanupRendererFeatures(List features) + { + for (var i = features.Count - 1; i >= 0; i--) + { + var feature = features[i]; + + // Delete null elements + if (feature == null) + { + features.RemoveAt(i); + continue; + } + + if (feature.GetType() == typeof(HTraceSSGIRendererFeature)) features.RemoveAt(i); + } + } + + private static void AddHTraceRendererFeature(UniversalRendererData universalRendererData, List features) + { + try + { + var hTraceFeature = ScriptableObject.CreateInstance(); + AssetDatabase.AddObjectToAsset(hTraceFeature, universalRendererData); + features.Add(hTraceFeature); + + Debug.Log($"{HNames.ASSET_NAME} Renderer Feature added successfully"); + } + catch (Exception e) + { + Debug.LogError($"Failed to add {HNames.ASSET_NAME} Renderer Feature: {e.Message}"); + } + } + + /// + /// Get all renderer features by Type in all RendererDatas + /// + /// Тип renderer feature + /// + public static List GetAllRendererFeatures() where T : ScriptableRendererFeature + { + var result = new List(); + var rendererDataList = GetRendererDataList(); + + if (rendererDataList == null) return result; + + foreach (var rendererData in rendererDataList) + { + if (rendererData?.rendererFeatures == null) continue; + + foreach (var feature in rendererData.rendererFeatures) + if (feature is T typedFeature) + result.Add(typedFeature); + } + + return result; + } + + public static int GetRenderersCount() + { + return GetRendererDataList()?.Length ?? 0; + } +#endif // UNITY_EDITOR + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs.meta new file mode 100644 index 0000000..153d5d5 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HRendererURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7c6ca928c19f4bff95978f4d91d3733e +timeCreated: 1757343206 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Globals/HRendererURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs new file mode 100644 index 0000000..5064320 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs @@ -0,0 +1,75 @@ +using UnityEngine; +using UnityEngine.Rendering; + +namespace HTraceSSGI.Scripts.Globals +{ + public static class HShaderParams + { + // ---------------------------------------------- Globals, "g_" prefix ---------------------------------------------- + public static readonly int g_HTraceGBuffer0 = Shader.PropertyToID("g_HTraceGBuffer0"); + public static readonly int g_HTraceGBuffer1 = Shader.PropertyToID("g_HTraceGBuffer1"); + public static readonly int g_HTraceGBuffer2 = Shader.PropertyToID("g_HTraceGBuffer2"); + public static readonly int g_HTraceGBuffer3 = Shader.PropertyToID("g_HTraceGBuffer3"); + public static readonly int g_HTraceRenderLayerMask = Shader.PropertyToID("g_HTraceRenderLayerMask"); + public static readonly int g_HTraceColor = Shader.PropertyToID("g_HTraceColor"); + public static readonly int g_HTraceDepth = Shader.PropertyToID("g_HTraceDepth"); + public static readonly int g_HTraceNormals = Shader.PropertyToID("g_HTraceNormals"); + public static readonly int g_HTraceSSAO = Shader.PropertyToID("g_HTraceSSAO"); + public static readonly int g_HTraceDepthPyramidSSGI = Shader.PropertyToID("g_HTraceDepthPyramidSSGI"); + public static readonly int g_HTraceStencilBuffer = Shader.PropertyToID("g_HTraceStencilBuffer"); + public static readonly int g_HTraceMotionVectors = Shader.PropertyToID("g_HTraceMotionVectors"); + public static readonly int g_HTraceMotionMask = Shader.PropertyToID("g_HTraceMotionMask"); + public static readonly int g_HTraceBufferAO = Shader.PropertyToID("_HTraceBufferAO"); + public static readonly int g_ScreenSpaceOcclusionTexture = Shader.PropertyToID("_ScreenSpaceOcclusionTexture"); + public static readonly int g_CameraDepthTexture = Shader.PropertyToID("_CameraDepthTexture"); + public static readonly int g_CameraNormalsTexture = Shader.PropertyToID("_CameraNormalsTexture"); + + + // ---------------------------------------------- GBuffer ---------------------------------------------- + public static readonly int _GBuffer0 = Shader.PropertyToID("_GBuffer0"); + public static readonly int _GBuffer1 = Shader.PropertyToID("_GBuffer1"); + public static readonly int _GBuffer2 = Shader.PropertyToID("_GBuffer2"); + public static readonly int _GBuffer3 = Shader.PropertyToID("_GBuffer3"); + public static readonly int _CameraRenderingLayersTexture = Shader.PropertyToID("_CameraRenderingLayersTexture"); + public static readonly int _GBufferTexture0 = Shader.PropertyToID("_GBufferTexture0"); + public static readonly int _RenderingLayerMaskTexture = Shader.PropertyToID("_RenderingLayersTexture"); + public static readonly int _CameraGBufferTexture0 = Shader.PropertyToID("_CameraGBufferTexture0"); + + public static readonly int _DepthPyramid_OutputMIP0 = Shader.PropertyToID("_DepthPyramid_OutputMIP0"); + public static readonly int _DepthPyramid_OutputMIP1 = Shader.PropertyToID("_DepthPyramid_OutputMIP1"); + public static readonly int _DepthPyramid_OutputMIP2 = Shader.PropertyToID("_DepthPyramid_OutputMIP2"); + public static readonly int _DepthPyramid_OutputMIP3 = Shader.PropertyToID("_DepthPyramid_OutputMIP3"); + public static readonly int _DepthPyramid_OutputMIP4 = Shader.PropertyToID("_DepthPyramid_OutputMIP4"); + + public static readonly int H_SHAr = Shader.PropertyToID("H_SHAr"); + public static readonly int H_SHAg = Shader.PropertyToID("H_SHAg"); + public static readonly int H_SHAb = Shader.PropertyToID("H_SHAb"); + public static readonly int H_SHBr = Shader.PropertyToID("H_SHBr"); + public static readonly int H_SHBg = Shader.PropertyToID("H_SHBg"); + public static readonly int H_SHBb = Shader.PropertyToID("H_SHBb"); + public static readonly int H_SHC = Shader.PropertyToID("H_SHC"); + + public static readonly string _GBUFFER_NORMALS_OCT = "_GBUFFER_NORMALS_OCT"; + public static readonly string _WRITE_RENDERING_LAYERS = "_WRITE_RENDERING_LAYERS"; + + public static readonly ShaderTagId UniversalGBufferTag = new ShaderTagId("UniversalGBuffer"); + + // ---------------------------------------------- Matrix ---------------------------------------------- + public static readonly int H_MATRIX_VP = Shader.PropertyToID("_H_MATRIX_VP"); + public static readonly int H_MATRIX_I_VP = Shader.PropertyToID("_H_MATRIX_I_VP"); + public static readonly int H_MATRIX_PREV_VP = Shader.PropertyToID("_H_MATRIX_PREV_VP"); + public static readonly int H_MATRIX_PREV_I_VP = Shader.PropertyToID("_H_MATRIX_PREV_I_VP"); + + // ---------------------------------------------- Additional ---------------------------------------------- + public static int HRenderScale = Shader.PropertyToID("_HRenderScale"); + public static int HRenderScalePrevious = Shader.PropertyToID("_HRenderScalePrevious"); + public static int FrameCount = Shader.PropertyToID("_FrameCount"); + public static int ScreenSize = Shader.PropertyToID("_ScreenSize"); + + // ---------------------------------------------- Shared Params Other ---------------------------------------------- + public static readonly int SliceXR = Shader.PropertyToID("_SliceXR"); + public static readonly int IndexXR = Shader.PropertyToID("_IndexXR"); + + public static readonly int RTAS = Shader.PropertyToID("_RTAS"); + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs.meta new file mode 100644 index 0000000..5fd81a6 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Globals/HShaderParams.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4df35d7b3e464734bb736f10640562a2 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Globals/HShaderParams.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs b/Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs new file mode 100644 index 0000000..2491979 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs @@ -0,0 +1,51 @@ +//pipelinedefine +#define H_URP + + +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Infrastructure.URP; +using UnityEngine; + +namespace HTraceSSGI.Scripts +{ + [ExecuteAlways, ExecuteInEditMode, ImageEffectAllowedInSceneView, DefaultExecutionOrder(100)] + [HelpURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK)] + public class HTraceSSGI : MonoBehaviour + { + [Tooltip("Currently used HTrace SSGI profile with settings")] + public HTraceSSGIProfile Profile; + + private void OnEnable() { + CheckProfile(); + } + + private void OnDisable() + { + HTraceSSGISettings.SetProfile(null); + } + + void OnValidate() { + CheckProfile(); + } + + private void Reset() { + CheckProfile(); + } + + void CheckProfile() + { + if (Profile == null) + { + Profile = ScriptableObject.CreateInstance(); + Profile.name = "New HTrace SSGI Profile"; +#if UNITY_EDITOR + UnityEditor.EditorUtility.SetDirty(this); +#endif + } + + HTraceSSGISettings.SetProfile(this.Profile); + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs.meta new file mode 100644 index 0000000..1777641 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/HTraceSSGI.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: dc3b78b63e384f78ba4235b7e210bccc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 72a9ca4a910cb6e478e3b0b89afa0b3c, type: 3} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/HTraceSSGI.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure.meta b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure.meta new file mode 100644 index 0000000..987d994 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f6b3ef9f6a43b53428590848541b0650 +timeCreated: 1724837665 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP.meta b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP.meta new file mode 100644 index 0000000..2ad4627 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 39d33876f15f45c091746aa50bedf133 +timeCreated: 1745943075 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs new file mode 100644 index 0000000..ac691b0 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs @@ -0,0 +1,180 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Globals; +using UnityEngine; +using UnityEngine.Rendering; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace HTraceSSGI.Scripts.Infrastructure.URP +{ + [ExecuteAlways] + public class HAmbientOverrideVolume: MonoBehaviour + { + private Volume _volumeComponent; +#if UNITY_6000_0_OR_NEWER + private ProbeVolumesOptions _probeVolumesOptionsOverrideComponent; +#endif + + private static HAmbientOverrideVolume s_instance; + + public static HAmbientOverrideVolume Instance + { + get + { + if (s_instance == null) + { + s_instance = FindObjectOfType(); + + if (s_instance == null) + { + GameObject singletonObject = new GameObject($"HTrace AmbientOverride"); + s_instance = singletonObject.AddComponent(); + + if (Application.isPlaying) + DontDestroyOnLoad(singletonObject); + } + } + + return s_instance; + } + } + + public void SetActiveVolume(bool isActive) + { + _volumeComponent.enabled = isActive; +#if UNITY_6000_0_OR_NEWER + _probeVolumesOptionsOverrideComponent.active = isActive; +#endif + } + + private void Awake() + { + InitializeSingleton(); + SetupVolumeURP(); + } + + private void InitializeSingleton() + { + if (s_instance == null) + { + s_instance = this; + if (Application.isPlaying) + DontDestroyOnLoad(gameObject); + } + else if (s_instance != this) + { + if (Application.isPlaying) + Destroy(gameObject); + else + DestroyImmediate(gameObject); + } + } + +#if UNITY_EDITOR + private void OnValidate() + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + if (!EditorApplication.isPlayingOrWillChangePlaymode) + SetupVolumeURP(); + + gameObject.hideFlags = HideFlags.HideAndDontSave; + if (s_instance != null && profile != null && profile.DebugSettings != null) + s_instance.gameObject.hideFlags = profile.DebugSettings.ShowBowels ? HideFlags.None : HideFlags.HideAndDontSave; + } +#endif + + private void OnDestroy() + { + if (s_instance == this) + { + s_instance = null; + } + } + + private void SetupVolumeURP() + { +#if UNITY_6000_0_OR_NEWER + CreateSSGIOverrideComponent(); + ApplySSGIOverrideComponentSettings(); + ChangeObjectWithSerialization_ONLYEDITOR(); +#endif + } + +#if UNITY_6000_0_OR_NEWER + private void CreateSSGIOverrideComponent() + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + if (profile != null && profile != null && profile.DebugSettings != null) + gameObject.hideFlags = profile.DebugSettings.ShowBowels ? HideFlags.None : HideFlags.HideAndDontSave; + + _volumeComponent = gameObject.GetComponent(); + if (_volumeComponent == null) + { + _volumeComponent = gameObject.AddComponent(); + _volumeComponent.enabled = false; + } + + if (_volumeComponent.sharedProfile == null) + { + //We can't crate it in runtime, because after build it will break. + //it will call only in editor, but if someone changes it in runtime, we will override. + _volumeComponent.sharedProfile = Resources.Load($"{HNames.ASSET_NAME}/HTraceSSGI Volume Profile URP"); + } + + if (_probeVolumesOptionsOverrideComponent == null) + _volumeComponent.sharedProfile.TryGet(out _probeVolumesOptionsOverrideComponent); + } + + private void ApplySSGIOverrideComponentSettings() + { + _volumeComponent.weight = 1; + _volumeComponent.priority = 100; +#if UNITY_EDITOR + _volumeComponent.runInEditMode = true; +#endif + if (_probeVolumesOptionsOverrideComponent != null) + { + _probeVolumesOptionsOverrideComponent.normalBias.overrideState = true; + _probeVolumesOptionsOverrideComponent.viewBias.overrideState = true; + _probeVolumesOptionsOverrideComponent.samplingNoise.overrideState = true; + } + } + + private void ChangeObjectWithSerialization_ONLYEDITOR() + { +#if UNITY_EDITOR + if (_probeVolumesOptionsOverrideComponent == null) + return; + + SerializedObject probeVolumesOptionsObject = new SerializedObject(_probeVolumesOptionsOverrideComponent); + + var normalBias = probeVolumesOptionsObject.FindProperty("normalBias"); + var m_OverrideState_normalBias = normalBias.FindPropertyRelative("m_OverrideState"); + var m_Value_normalBias = normalBias.FindPropertyRelative("m_Value"); + m_OverrideState_normalBias.boolValue = true; + m_Value_normalBias.floatValue = 0.0f; + + var viewBias = probeVolumesOptionsObject.FindProperty("viewBias"); + var m_OverrideState_viewBias = viewBias.FindPropertyRelative("m_OverrideState"); + var m_Value_viewBias = viewBias.FindPropertyRelative("m_Value"); + m_OverrideState_viewBias.boolValue = true; + m_Value_viewBias.floatValue = 0.0f; + + var samplingNoise = probeVolumesOptionsObject.FindProperty("samplingNoise"); + var m_OverrideState_samplingNoise = samplingNoise.FindPropertyRelative("m_OverrideState"); + var m_Value_samplingNoise = samplingNoise.FindPropertyRelative("m_Value"); + m_OverrideState_samplingNoise.boolValue = true; + m_Value_samplingNoise.floatValue = 0.0f; + + probeVolumesOptionsObject.ApplyModifiedProperties(); +#endif + } +#endif + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs.meta new file mode 100644 index 0000000..120249e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 665d2080decf49c2b73ac4747dbde1df +timeCreated: 1757588204 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Infrastructure/URP/HAmbientOverrideVolume.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs new file mode 100644 index 0000000..6b53cc3 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs @@ -0,0 +1,229 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Editor; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Passes.URP; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; +#if UNITY_EDITOR +using HTraceSSGI.Scripts.PipelelinesConfigurator; +using UnityEditor; +#endif + +namespace HTraceSSGI.Scripts.Infrastructure.URP +{ + [DisallowMultipleRendererFeature] + [ExecuteAlways, ExecuteInEditMode] + [HelpURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK)] + public class HTraceSSGIRendererFeature : ScriptableRendererFeature + { + public bool UseVolumes = true; + internal static bool IsUseVolumes { get; private set; } + + private PrePassURP _prePassURP; + private MotionVectorsURP _motionVectors; + private GBufferPassURP _gBufferPass; + private SSGIPassURP _ssgiPassUrp; + private FinalPassURP _finalPassURP; + + private bool _initialized = false; + + /// + /// Initializes this feature's resources. This is called every time serialization happens. + /// + public override void Create() + { + name = HNames.ASSET_NAME_FULL; + // ActiveProfile = Profile; + IsUseVolumes = UseVolumes; + Dispose(); + + if (UseVolumes) + { + var stack = VolumeManager.instance.stack; + HTraceSSGIVolume hTraceVolume = stack?.GetComponent(); + SettingsBuild(hTraceVolume); + } + + _prePassURP = new PrePassURP(); + _prePassURP.renderPassEvent = RenderPassEvent.AfterRenderingOpaques; + _motionVectors = new MotionVectorsURP(); + _motionVectors.renderPassEvent = RenderPassEvent.AfterRenderingOpaques; + _gBufferPass = new GBufferPassURP(); + _gBufferPass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques; + _ssgiPassUrp = new SSGIPassURP(); + _ssgiPassUrp.renderPassEvent = RenderPassEvent.AfterRenderingOpaques; + _finalPassURP = new FinalPassURP(); + _finalPassURP.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; + +#if UNITY_EDITOR + HPipelinesConfigurator.AlwaysIncludedShaders(); +#endif + + _initialized = true; + } + + /// + /// Called when render targets are allocated and ready to be used. + /// + /// + /// + /// + public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) + { + if (_initialized == false) + return; + + if (HRendererURP.RenderGraphEnabled == false) + { + _prePassURP.Initialize(renderer); + _motionVectors.Initialize(renderer); + _gBufferPass.Initialize(renderer); + _ssgiPassUrp.Initialize(renderer); + _finalPassURP.Initialize(renderer); + } + } + + /// + /// Injects one or multiple ScriptableRenderPass in the renderer. + /// + /// + /// + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + if (renderingData.cameraData.cameraType == CameraType.Reflection || renderingData.cameraData.cameraType == CameraType.Preview) + return; + + var isActive = HTraceSSGISettings.ActiveProfile != null; + + IsUseVolumes = UseVolumes; + if (UseVolumes) + { + var stack = VolumeManager.instance.stack; + var hTraceVolume = stack.GetComponent(); + isActive = hTraceVolume != null && hTraceVolume.IsActive(); + + SettingsBuild(hTraceVolume); + } + +#if UNITY_6000_0_OR_NEWER + HAmbientOverrideVolume.Instance.SetActiveVolume(isActive && HTraceSSGISettings.ActiveProfile != null && HTraceSSGISettings.ActiveProfile.GeneralSettings != null && HTraceSSGISettings.ActiveProfile.GeneralSettings.AmbientOverride); +#endif + + if (!isActive) + return; + +#if !UNITY_2022_1_OR_NEWER + _prePassURP.Initialize(renderer); + _motionVectors.Initialize(renderer); + _gBufferPass.Initialize(renderer); + _ssgiPassUrp.Initialize(renderer); + _finalPassURP.Initialize(renderer); +#endif + renderer.EnqueuePass(_prePassURP); + renderer.EnqueuePass(_motionVectors); + renderer.EnqueuePass(_gBufferPass); + renderer.EnqueuePass(_ssgiPassUrp); + renderer.EnqueuePass(_finalPassURP); + } + + private void SettingsBuild(HTraceSSGIVolume hTraceVolume) + { + if (hTraceVolume == null || UseVolumes == false) + return; + + if (HTraceSSGISettings.ActiveProfile == null) + { + HTraceSSGISettings.SetProfile(ScriptableObject.CreateInstance()); +#if UNITY_EDITOR + HTraceSSGISettings.ActiveProfile.ApplyPreset(HTraceSSGIPreset.Balanced); +#endif + HTraceSSGISettings.ActiveProfile.name = "New HTrace SSGI Profile"; + } + + var activeProfile = HTraceSSGISettings.ActiveProfile; + + // Global Settings + activeProfile.GeneralSettings.DebugMode = hTraceVolume.DebugMode.value; + activeProfile.GeneralSettings.HBuffer = hTraceVolume.HBuffer.value; + + // Global - Pipeline Integration + activeProfile.GeneralSettings.MetallicIndirectFallback = hTraceVolume.MetallicIndirectFallback.value; + activeProfile.GeneralSettings.AmbientOverride = hTraceVolume.AmbientOverride.value; + activeProfile.GeneralSettings.Multibounce = hTraceVolume.Multibounce.value; +#if UNITY_2023_3_OR_NEWER + activeProfile.GeneralSettings.ExcludeReceivingMask = hTraceVolume.ExcludeReceivingMask.value; + activeProfile.GeneralSettings.ExcludeCastingMask = hTraceVolume.ExcludeCastingMask.value; +#endif + activeProfile.GeneralSettings.FallbackType = hTraceVolume.FallbackType.value; + activeProfile.GeneralSettings.SkyIntensity = hTraceVolume.SkyIntensity.value; + + // APV parameters + activeProfile.GeneralSettings.ViewBias = hTraceVolume.ViewBias.value; + activeProfile.GeneralSettings.NormalBias = hTraceVolume.NormalBias.value; + activeProfile.GeneralSettings.SamplingNoise = hTraceVolume.SamplingNoise.value; + activeProfile.GeneralSettings.IntensityMultiplier = hTraceVolume.IntensityMultiplier.value; + activeProfile.GeneralSettings.DenoiseFallback = hTraceVolume.DenoiseFallback.value; + + // Global - Visuals + activeProfile.SSGISettings.BackfaceLighting = hTraceVolume.BackfaceLighting.value; + activeProfile.SSGISettings.MaxRayLength = hTraceVolume.MaxRayLength.value; + activeProfile.SSGISettings.ThicknessMode = hTraceVolume.ThicknessMode.value; + activeProfile.SSGISettings.Thickness = hTraceVolume.Thickness.value; + activeProfile.SSGISettings.Intensity = hTraceVolume.Intensity.value; + activeProfile.SSGISettings.Falloff = hTraceVolume.Falloff.value; + + // Quality - Tracing + activeProfile.SSGISettings.RayCount = hTraceVolume.RayCount.value; + activeProfile.SSGISettings.StepCount = hTraceVolume.StepCount.value; + activeProfile.SSGISettings.RefineIntersection = hTraceVolume.RefineIntersection.value; + activeProfile.SSGISettings.FullResolutionDepth = hTraceVolume.FullResolutionDepth.value; + + // Quality - Rendering + activeProfile.SSGISettings.Checkerboard = hTraceVolume.Checkerboard.value; + activeProfile.SSGISettings.RenderScale = hTraceVolume.RenderScale.value; + + // Denoising + activeProfile.DenoisingSettings.BrightnessClamp = hTraceVolume.BrightnessClamp.value; + activeProfile.DenoisingSettings.MaxValueBrightnessClamp = hTraceVolume.MaxValueBrightnessClamp.value; + activeProfile.DenoisingSettings.MaxDeviationBrightnessClamp = hTraceVolume.MaxDeviationBrightnessClamp.value; + + // Denoising - ReSTIR Validation + activeProfile.DenoisingSettings.HalfStepValidation = hTraceVolume.HalfStepValidation.value; + activeProfile.DenoisingSettings.SpatialOcclusionValidation = hTraceVolume.SpatialOcclusionValidation.value; + activeProfile.DenoisingSettings.TemporalLightingValidation = hTraceVolume.TemporalLightingValidation.value; + activeProfile.DenoisingSettings.TemporalOcclusionValidation = hTraceVolume.TemporalOcclusionValidation.value; + + // Denoising - Spatial Filter + activeProfile.DenoisingSettings.SpatialRadius = hTraceVolume.SpatialRadius.value; + activeProfile.DenoisingSettings.Adaptivity = hTraceVolume.Adaptivity.value; + activeProfile.DenoisingSettings.RecurrentBlur = hTraceVolume.RecurrentBlur.value; + activeProfile.DenoisingSettings.FireflySuppression = hTraceVolume.FireflySuppression.value; + + // Debug + activeProfile.DebugSettings.ShowBowels = hTraceVolume.ShowBowels.value; + } + + protected override void Dispose(bool disposing) + { + _prePassURP?.Dispose(); + _motionVectors?.Dispose(); + _gBufferPass?.Dispose(); + _ssgiPassUrp?.Dispose(); + _finalPassURP?.Dispose(); + + _prePassURP = null; + _motionVectors = null; + _gBufferPass = null; + _ssgiPassUrp = null; + _finalPassURP = null; + + _initialized = false; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs.meta new file mode 100644 index 0000000..106be19 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 43a84b065505d8f41b624b74c882ed4b +timeCreated: 1729922427 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIRendererFeature.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs new file mode 100644 index 0000000..095902b --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs @@ -0,0 +1,231 @@ +//pipelinedefine +#define H_URP + + +using System; +using HTraceSSGI.Scripts.Globals; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +namespace HTraceSSGI.Scripts.Infrastructure.URP +{ +#if UNITY_2023_1_OR_NEWER + [VolumeComponentMenu("Lighting/HTrace: Screen Space Global Illumination"), SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))] +#else +[VolumeComponentMenuForRenderPipeline("Lighting/HTrace: Screen Space Global Illumination", typeof(UniversalRenderPipeline))] +#endif +#if UNITY_2023_3_OR_NEWER + [VolumeRequiresRendererFeatures(typeof(HTraceSSGIRendererFeature))] +#endif + [HelpURL(HNames.HTRACE_SSGI_DOCUMENTATION_LINK)] + public sealed class HTraceSSGIVolume : VolumeComponent, IPostProcessComponent + { + public HTraceSSGIVolume() + { + displayName = HNames.ASSET_NAME_FULL; + } + + /// + /// Enable Screen Space Global Illumination. + /// + [Tooltip("Enable HTrace Screen Space Global Illumination")] + public BoolParameter Enable = new BoolParameter(false, BoolParameter.DisplayType.EnumPopup); + + // --------------------------------------- GLOBAL SETTINGS --------------------------------------------- + + [InspectorName("Debug Mode"), Tooltip("")] + public DebugModeParameter DebugMode = new(Globals.DebugMode.None, false); + + [InspectorName("Buffer"), Tooltip("Visualizes data from different buffers for debugging")] + public HBufferParameter HBuffer = new(Globals.HBuffer.Multi, false); + +#if UNITY_2023_3_OR_NEWER + [InspectorName("Exclude Casting Mask"), Tooltip("Prevents objects on the selected layers from contributing to GI")] + public RenderingLayerMaskEnumParameter ExcludeCastingMask = new(0, false); + + [InspectorName("Exclude Receiving Mask"), Tooltip("Prevents objects on the selected layers from receiving GI")] + public RenderingLayerMaskEnumParameter ExcludeReceivingMask = new(0, false); +#endif + + [InspectorName("Fallback Type"), Tooltip("Fallback data for rays that failed to find a hit in screen space")] + public FallbackTypeParameter FallbackType = new FallbackTypeParameter(Globals.FallbackType.None, false); + + [InspectorName("Sky Intensity"), Tooltip("Brightness of the sky used for fallback")] + public ClampedFloatParameter SkyIntensity = new ClampedFloatParameter(0.5f, 0.0f, 1.0f, false); + + [InspectorName("View Bias"), Tooltip("Offsets the APV sample position towards the camera")] + public ClampedFloatParameter ViewBias = new ClampedFloatParameter(0.1f, 0.0f, 2.0f, false); + + [InspectorName("Normal Bias"), Tooltip("Offsets the APV sample position along the pixel’s surface normal")] + public ClampedFloatParameter NormalBias = new ClampedFloatParameter(0.25f, 0.0f, 2.0f, false); + + [InspectorName("Sampling Noise"), Tooltip("Amount of jitter noise added to the APV sample position")] + public ClampedFloatParameter SamplingNoise = new ClampedFloatParameter(0.1f, 0.0f, 1.0f, false); + + [InspectorName("Intensity Multiplier"), Tooltip("Strength of the light contribution from APV")] + public ClampedFloatParameter IntensityMultiplier = new ClampedFloatParameter(1.0f, 0.0f, 1.0f, false); + + [InspectorName("Denoise Fallback"), Tooltip("Includes fallback lighting in denoising")] + public BoolParameter DenoiseFallback = new BoolParameter(true, false); + + // ------------------------------------- Pipeline Integration ----------------------------------------- + + [InspectorName("Metallic Indirect Fallback"), Tooltip("Renders metals as diffuse when no reflections exist, preventing them from going black")] + public BoolParameter MetallicIndirectFallback = new BoolParameter(false, false); + + [InspectorName("Ambient Override"), Tooltip("Removes Unity’s ambient lighting before HTrace SSGI runs to avoid double GI")] + public BoolParameter AmbientOverride = new BoolParameter(true, false); + + [InspectorName("Multibounce"), Tooltip("Uses previous frame GI to approximate additional light bounces")] + public BoolParameter Multibounce = new BoolParameter(true, false); + + // -------------------------------------------- Visuals ----------------------------------------------- + + [InspectorName("Backface Lighting"), Tooltip("Include lighting from back-facing surfaces")] + public ClampedFloatParameter BackfaceLighting = new ClampedFloatParameter(0.25f, 0.0f, 1.0f, false); + + [InspectorName("Max Ray Length"), Tooltip("Maximum ray distance in meters")] + public ClampedFloatParameter MaxRayLength = new ClampedFloatParameter(100.0f, 0.0f, float.MaxValue, false); + + [InspectorName("Thickness Mode"), Tooltip("Method used for thickness estimation")] + public ThicknessModeParameter ThicknessMode = new(Globals.ThicknessMode.Relative, false); + + [InspectorName("Thickness"), Tooltip("Virtual object thickness for ray intersections")] + public ClampedFloatParameter Thickness = new ClampedFloatParameter(0.35f, 0.0f, 1.0f, false); + + [InspectorName("Intensity"), Tooltip("Indirect lighting intensity multiplier")] + public ClampedFloatParameter Intensity = new ClampedFloatParameter(1.0f, 0.1f, 5.0f, false); + + [InspectorName("Falloff"), Tooltip("Softens indirect lighting over distance")] + public ClampedFloatParameter Falloff = new ClampedFloatParameter(0.0f, 0.0f, 1.0f, false); + + // -------------------------------------------- QUALITY ----------------------------------------------- + + // -------------------------------------------- Tracing ----------------------------------------------- + + [InspectorName("Ray Count"), Tooltip("Number of rays per pixel")] + public ClampedIntParameter RayCount = new ClampedIntParameter(3, 2, 16, false); + + [InspectorName("Step Count"), Tooltip("Number of steps per ray")] + public ClampedIntParameter StepCount = new ClampedIntParameter(24, 8, 64, false); + + [InspectorName("Refine Intersection"), Tooltip("Extra check to confirm intersection")] + public BoolParameter RefineIntersection = new BoolParameter(true, false); + + [InspectorName("Full Resolution Depth"), Tooltip("Uses full-res depth buffer for tracing")] + public BoolParameter FullResolutionDepth = new BoolParameter(true, false); + + // ------------------------------------------- Rendering ----------------------------------------------- + + [InspectorName("Checkerboard"), Tooltip("Enables checkerboard rendering, processing only half of the pixels per frame")] + public BoolParameter Checkerboard = new BoolParameter(false, false); + + [InspectorName("Render Scale"), Tooltip("Local render scale of SSGI pipeline")] + public ClampedFloatParameter RenderScale = new ClampedFloatParameter(1.0f, 0.5f, 1.0f, false); + + // ------------------------------------------- DENOISING ----------------------------------------------- + + [InspectorName("Brightness Clamp"), Tooltip("Defines the maximum brightness at the hit point")] + public BrightnessClampParameter BrightnessClamp = new(Globals.BrightnessClamp.Manual, false); + + [InspectorName("Max Value"), Tooltip("Maximum brightness allowed at hit points.")] + public ClampedFloatParameter MaxValueBrightnessClamp = new ClampedFloatParameter(7.0f, 1.0f, 30.0f, false); + + [InspectorName("Max Deviation"), Tooltip("Maximum standard deviation for brightness allowed at hit points")] + public ClampedFloatParameter MaxDeviationBrightnessClamp = new ClampedFloatParameter(3.0f, 1.0f, 5.0f, false); + + // ---------------------------------------- ReSTIR Validation ------------------------------------------ + + [InspectorName("Half Step"), Tooltip("Halves validation ray steps")] + public BoolParameter HalfStepValidation = new BoolParameter(false, false); + + [InspectorName("Spatial Occlusion"), Tooltip("Protects indirect shadows and details from overblurring")] + public BoolParameter SpatialOcclusionValidation = new BoolParameter(true, false); + + [InspectorName("Temporal Lighting"), Tooltip("Faster reaction to changing lighting conditions")] + public BoolParameter TemporalLightingValidation = new BoolParameter(true, false); + + [InspectorName("Temporal Occlusion"), Tooltip("Faster reaction to moving indirect shadows")] + public BoolParameter TemporalOcclusionValidation = new BoolParameter(true, false); + + + // ----------------------------------------- Spatial Filter --------------------------------------------------- + + [InspectorName("Spatial"), Tooltip("Width of spatial filter")] + public ClampedFloatParameter SpatialRadius = new ClampedFloatParameter(0.6f, 0.0f, 1.0f, false); + + [InspectorName("Adaptivity"), Tooltip("Shrinks the filter radius in geometry corners to preserve details")] + public ClampedFloatParameter Adaptivity = new ClampedFloatParameter(0.9f, 0.0f, 1.0f, false); + + [InspectorName("Recurrent Blur"), Tooltip("Makes blur stronger by using the spatial output as temporal history")] + public BoolParameter RecurrentBlur = new BoolParameter(false, false); + + [InspectorName("Firefly Suppression"), Tooltip("Removes bright outliers before denoising")] + public BoolParameter FireflySuppression = new BoolParameter(false, false); + + // ----------------------------------------------- Debug ----------------------------------------------------- + + public BoolParameter ShowBowels = new BoolParameter(false, true); + + public bool IsActive() + { + return Enable.value; + } + +#if !UNITY_2023_2_OR_NEWER + public bool IsTileCompatible() => false; +#endif + + [Serializable] + public sealed class HBufferParameter : VolumeParameter + { + /// The initial value to store in the parameter. + /// The initial override state for the parameter. + public HBufferParameter(HBuffer value, bool overrideState = false) : base(value, overrideState) { } + } + + [Serializable] + public sealed class DebugModeParameter : VolumeParameter + { + /// The initial value to store in the parameter. + /// The initial override state for the parameter. + public DebugModeParameter(DebugMode value, bool overrideState = false) : base(value, overrideState) { } + } + +#if UNITY_2023_3_OR_NEWER + [Serializable] + public sealed class RenderingLayerMaskEnumParameter : VolumeParameter + { + /// The initial value to store in the parameter. + /// The initial override state for the parameter. + public RenderingLayerMaskEnumParameter(RenderingLayerMask value, bool overrideState = false) : base(value, overrideState) { } + } +#endif + + [Serializable] + public sealed class FallbackTypeParameter : VolumeParameter + { + /// The initial value to store in the parameter. + /// The initial override state for the parameter. + public FallbackTypeParameter(FallbackType value, bool overrideState = false) : base(value, overrideState) { } + } + + [Serializable] + public sealed class ThicknessModeParameter : VolumeParameter + { + /// The initial value to store in the parameter. + /// The initial override state for the parameter. + public ThicknessModeParameter(ThicknessMode value, bool overrideState = false) : base(value, overrideState) { } + } + + [Serializable] + public sealed class BrightnessClampParameter : VolumeParameter + { + /// The initial value to store in the parameter. + /// The initial override state for the parameter. + public BrightnessClampParameter(BrightnessClamp value, bool overrideState = false) : base(value, overrideState) { } + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs.meta new file mode 100644 index 0000000..c46bd90 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5f17acff6deb4f089d110375635d4e37 +timeCreated: 1756743404 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Infrastructure/URP/HTraceSSGIVolume.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes.meta new file mode 100644 index 0000000..e20176d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1da92c815c29dea40bd8c6c3d6f75312 +timeCreated: 1674801896 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared.meta new file mode 100644 index 0000000..b3a17c8 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7a79b752c0a5472889da303294bb41c1 +timeCreated: 1756743088 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs new file mode 100644 index 0000000..d0c0fc9 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs @@ -0,0 +1,63 @@ +using UnityEngine; +using UnityEngine.Rendering; + +namespace HTraceSSGI.Scripts.Passes.Shared +{ + internal static class HBlueNoise + { + internal static readonly int g_OwenScrambledTexture = Shader.PropertyToID("g_OwenScrambledTexture"); + internal static readonly int g_ScramblingTileXSPP = Shader.PropertyToID("g_ScramblingTileXSPP"); + internal static readonly int g_RankingTileXSPP = Shader.PropertyToID("g_RankingTileXSPP"); + internal static readonly int g_ScramblingTexture = Shader.PropertyToID("g_ScramblingTexture"); + + private static Texture2D _owenScrambledTexture; + public static Texture2D OwenScrambledTexture + { + get + { + if (_owenScrambledTexture == null) + _owenScrambledTexture = UnityEngine.Resources.Load("HTraceSSGI/BlueNoise/OwenScrambledNoise256"); + return _owenScrambledTexture; + } + } + + private static Texture2D _scramblingTileXSPP; + public static Texture2D ScramblingTileXSPP + { + get + { + if (_scramblingTileXSPP == null) + _scramblingTileXSPP = UnityEngine.Resources.Load("HTraceSSGI/BlueNoise/ScramblingTile8SPP"); + return _scramblingTileXSPP; + } + } + private static Texture2D _rankingTileXSPP; + public static Texture2D RankingTileXSPP + { + get + { + if (_rankingTileXSPP == null) + _rankingTileXSPP = UnityEngine.Resources.Load("HTraceSSGI/BlueNoise/RankingTile8SPP"); + return _rankingTileXSPP; + } + } + private static Texture2D _scramblingTexture; + public static Texture2D ScramblingTexture + { + get + { + if (_scramblingTexture == null) + _scramblingTexture = UnityEngine.Resources.Load("HTraceSSGI/BlueNoise/ScrambleNoise"); + return _scramblingTexture; + } + } + + public static void SetTextures(CommandBuffer cmdList) + { + cmdList.SetGlobalTexture(g_OwenScrambledTexture, OwenScrambledTexture); + cmdList.SetGlobalTexture(g_ScramblingTileXSPP, ScramblingTileXSPP); + cmdList.SetGlobalTexture(g_RankingTileXSPP, RankingTileXSPP); + cmdList.SetGlobalTexture(g_ScramblingTexture, ScramblingTexture); + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs.meta new file mode 100644 index 0000000..60aec01 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9b39dbedfe8559c4984c466e938fdf33 +timeCreated: 1729617470 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/Shared/HBlueNoise.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs new file mode 100644 index 0000000..179b775 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs @@ -0,0 +1,667 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Extensions.CameraHistorySystem; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Wrappers; +using UnityEngine; +using UnityEngine.Rendering; +using HTraceSSGI.Scripts.Infrastructure.URP; + +namespace HTraceSSGI.Scripts.Passes.Shared +{ + internal class SSGI + { + // Kernels + internal enum HTemporalReprojectionKernels + { + TemporalReprojection = 0, + ColorReprojection = 1, + CopyHistory = 2, + LuminanceMomentsGeneration = 3, + LuminanceMomentsClear = 4, + } + + internal enum HCheckerboardingKernels + { + CheckerboardClassification = 0, + IndirectArguments = 1, + } + + internal enum HRenderSSGIKernels + { + TraceSSGI = 0, + MaskExclude = 1, + } + + internal enum HReSTIRKernels + { + TemporalResampling = 0, + FireflySuppression = 1, + SpatialResampling = 2, + SpatialValidation = 3, + } + + internal enum HDenoiserKernels + { + TemporalAccumulation = 0, + TemporalStabilization = 1, + PointDistributionFill = 2, + SpatialFilter = 3, + SpatialFilter1 = 4, + SpatialFilter2 = 5, + } + + internal enum HInterpolationKernels + { + Interpolation = 0, + } + + // Textures, except History + public static RTWrapper ColorCopy_URP = new RTWrapper(); // URP only + public static RTWrapper DebugOutput = new RTWrapper(); + public static RTWrapper ReservoirLuminance = new RTWrapper(); + public static RTWrapper Reservoir = new RTWrapper(); + public static RTWrapper ReservoirReprojected = new RTWrapper(); + public static RTWrapper ReservoirSpatial = new RTWrapper(); + public static RTWrapper SamplecountReprojected = new RTWrapper(); + public static RTWrapper TemporalInvalidityFilteredA = new RTWrapper(); + public static RTWrapper TemporalInvalidityFilteredB = new RTWrapper(); + public static RTWrapper TemporalInvalidityReprojected = new RTWrapper(); + public static RTWrapper SpatialOcclusionReprojected = new RTWrapper(); + public static RTWrapper AmbientOcclusion = new RTWrapper(); + public static RTWrapper AmbientOcclusionGuidance = new RTWrapper(); + public static RTWrapper AmbientOcclusionInvalidity = new RTWrapper(); + public static RTWrapper AmbientOcclusionReprojected = new RTWrapper(); + public static RTWrapper RadianceReprojected = new RTWrapper(); + public static RTWrapper RadianceFiltered = new RTWrapper(); + public static RTWrapper RadianceInterpolated = new RTWrapper(); + public static RTWrapper RadianceStabilized = new RTWrapper(); + public static RTWrapper RadianceStabilizedReprojected = new RTWrapper(); + public static RTWrapper RadianceNormalDepth = new RTWrapper(); + public static RTWrapper ColorReprojected = new RTWrapper(); + public static RTWrapper DummyBlackTexture = new RTWrapper(); + + // History Textures + internal struct HistoryCameraDataSSGI : ICameraHistoryData, IDisposable + { + private int hash; + public RTWrapper ColorPreviousFrame; + public RTWrapper ReservoirTemporal; + public RTWrapper SampleCount; + public RTWrapper NormalDepth; + public RTWrapper NormalDepthFullRes; + public RTWrapper Radiance; + public RTWrapper RadianceAccumulated; + public RTWrapper SpatialOcclusionAccumulated; + public RTWrapper TemporalInvalidityAccumulated; + public RTWrapper AmbientOcclusionAccumulated; + + public HistoryCameraDataSSGI(int hash = 0) + { + this.hash = hash; + ColorPreviousFrame = new RTWrapper(); + ReservoirTemporal = new RTWrapper(); + SampleCount = new RTWrapper(); + NormalDepth = new RTWrapper(); + NormalDepthFullRes = new RTWrapper(); + Radiance = new RTWrapper(); + RadianceAccumulated = new RTWrapper(); + SpatialOcclusionAccumulated = new RTWrapper(); + TemporalInvalidityAccumulated = new RTWrapper(); + AmbientOcclusionAccumulated = new RTWrapper(); + } + + public int GetHash() => hash; + public void SetHash(int hashIn) => this.hash = hashIn; + + public void Dispose() + { + ColorPreviousFrame?.HRelease(); + ReservoirTemporal?.HRelease(); + SampleCount?.HRelease(); + NormalDepth?.HRelease(); + NormalDepthFullRes?.HRelease(); + Radiance?.HRelease(); + RadianceAccumulated?.HRelease(); + SpatialOcclusionAccumulated?.HRelease(); + TemporalInvalidityAccumulated?.HRelease(); + AmbientOcclusionAccumulated?.HRelease(); + } + } + + internal static readonly CameraHistorySystem CameraHistorySystem = new CameraHistorySystem(); + + // Shader Properties + public static readonly int _RayCounter = Shader.PropertyToID("_RayCounter"); + public static readonly int _RayCounter_Output = Shader.PropertyToID("_RayCounter_Output"); + public static readonly int _IndirectCoords_Output = Shader.PropertyToID("_IndirectCoords_Output"); + public static readonly int _IndirectArguments_Output = Shader.PropertyToID("_IndirectArguments_Output"); + public static readonly int _TracingCoords = Shader.PropertyToID("_TracingCoords"); + public static readonly int _RayTracedCounter = Shader.PropertyToID("_RayTracedCounter"); + public static readonly int _DepthToViewParams = Shader.PropertyToID("_DepthToViewParams"); + public static readonly int _HScaleFactorSSGI = Shader.PropertyToID("_HScaleFactorSSGI"); + public static readonly int _HPreviousScaleFactorSSGI = Shader.PropertyToID("_HPreviousScaleFactorSSGI"); + public static readonly int _ReservoirDiffuseWeight = Shader.PropertyToID("_ReservoirDiffuseWeight"); + public static readonly int _ExcludeCastingLayerMaskSSGI = Shader.PropertyToID("_ExcludeCastingLayerMaskSSGI"); + public static readonly int _ExcludeReceivingLayerMaskSSGI = Shader.PropertyToID("_ExcludeReceivingLayerMaskSSGI"); + public static readonly int _APVParams = Shader.PropertyToID("_APVParams"); + public static readonly int _BrightnessClamp = Shader.PropertyToID("_BrightnessClamp"); + public static readonly int _MaxDeviation = Shader.PropertyToID("_MaxDeviation"); + public static readonly int _RayCount = Shader.PropertyToID("_RayCount"); + public static readonly int _StepCount = Shader.PropertyToID("_StepCount"); + public static readonly int _RayLength = Shader.PropertyToID("_RayLength"); + public static readonly int _SkyFallbackIntensity = Shader.PropertyToID("_SkyFallbackIntensity"); + public static readonly int _BackfaceLighting = Shader.PropertyToID("_BackfaceLighting"); + public static readonly int _Falloff = Shader.PropertyToID("_Falloff"); + public static readonly int _ThicknessParams = Shader.PropertyToID("_ThicknessParams"); + public static readonly int _DenoiseFallback = Shader.PropertyToID("_DenoiseFallback"); + public static readonly int _FilterAdaptivity = Shader.PropertyToID("_FilterAdaptivity"); + public static readonly int _FilterRadius = Shader.PropertyToID("_FilterRadius"); + public static readonly int _ColorCopy = Shader.PropertyToID("_ColorCopy"); + public static readonly int _Color_History = Shader.PropertyToID("_Color_History"); + public static readonly int _LuminanceMoments = Shader.PropertyToID("_LuminanceMoments"); + public static readonly int _Radiance_History = Shader.PropertyToID("_Radiance_History"); + public static readonly int _RadianceNormalDepth = Shader.PropertyToID("_RadianceNormalDepth"); + public static readonly int _Radiance_Output = Shader.PropertyToID("_Radiance_Output"); + public static readonly int _NormalDepth_History = Shader.PropertyToID("_NormalDepth_History"); + public static readonly int _ReprojectedColor_Output = Shader.PropertyToID("_ReprojectedColor_Output"); + public static readonly int _Samplecount_History = Shader.PropertyToID("_Samplecount_History"); + public static readonly int _Samplecount_Output = Shader.PropertyToID("_Samplecount_Output"); + public static readonly int _SpatialOcclusion_History = Shader.PropertyToID("_SpatialOcclusion_History"); + public static readonly int _SpatialOcclusion_Output = Shader.PropertyToID("_SpatialOcclusion_Output"); + public static readonly int _PointDistribution_Output = Shader.PropertyToID("_PointDistribution_Output"); + public static readonly int _Reservoir = Shader.PropertyToID("_Reservoir"); + public static readonly int _Reservoir_Output = Shader.PropertyToID("_Reservoir_Output"); + public static readonly int _TemporalInvalidity_History = Shader.PropertyToID("_TemporalInvalidity_History"); + public static readonly int _TemporalInvalidity_Output = Shader.PropertyToID("_TemporalInvalidity_Output"); + public static readonly int _AmbientOcclusion_History = Shader.PropertyToID("_AmbientOcclusion_History"); + public static readonly int _AmbientOcclusion_Output = Shader.PropertyToID("_AmbientOcclusion_Output"); + public static readonly int _SampleCount = Shader.PropertyToID("_SampleCount"); + public static readonly int _Color = Shader.PropertyToID("_Color"); + public static readonly int _AmbientOcclusion = Shader.PropertyToID("_AmbientOcclusion"); + public static readonly int _AmbientOcclusionInvalidity = Shader.PropertyToID("_AmbientOcclusionInvalidity"); + public static readonly int _AmbientOcclusionReprojected = Shader.PropertyToID("_AmbientOcclusionReprojected"); + public static readonly int _SpatialOcclusion = Shader.PropertyToID("_SpatialOcclusion"); + public static readonly int _ReservoirReprojected = Shader.PropertyToID("_ReservoirReprojected"); + public static readonly int _ReservoirSpatial_Output = Shader.PropertyToID("_ReservoirSpatial_Output"); + public static readonly int _ReservoirLuminance = Shader.PropertyToID("_ReservoirLuminance"); + public static readonly int _ReservoirTemporal_Output = Shader.PropertyToID("_ReservoirTemporal_Output"); + public static readonly int _TemporalInvalidity = Shader.PropertyToID("_TemporalInvalidity"); + public static readonly int _NormalDepth_HistoryOutput = Shader.PropertyToID("_NormalDepth_HistoryOutput"); + public static readonly int _ReservoirLuminance_Output = Shader.PropertyToID("_ReservoirLuminance_Output"); + public static readonly int _SpatialGuidance_Output = Shader.PropertyToID("_SpatialGuidance_Output"); + public static readonly int _PointDistribution = Shader.PropertyToID("_PointDistribution"); + public static readonly int _NormalDepth = Shader.PropertyToID("_NormalDepth"); + public static readonly int _RadianceNormalDepth_Output = Shader.PropertyToID("_RadianceNormalDepth_Output"); + public static readonly int _SpatialGuidance = Shader.PropertyToID("_SpatialGuidance"); + public static readonly int _SamplecountReprojected = Shader.PropertyToID("_SamplecountReprojected"); + public static readonly int _Radiance = Shader.PropertyToID("_Radiance"); + public static readonly int _RadianceReprojected = Shader.PropertyToID("_RadianceReprojected"); + public static readonly int _Radiance_TemporalOutput = Shader.PropertyToID("_Radiance_TemporalOutput"); + public static readonly int _Radiance_SpatialOutput = Shader.PropertyToID("_Radiance_SpatialOutput"); + public static readonly int _SampleCountSSGI = Shader.PropertyToID("_SampleCountSSGI"); + public static readonly int _HTraceBufferGI = Shader.PropertyToID("_HTraceBufferGI"); + public static readonly int _IndirectLightingIntensity = Shader.PropertyToID("_IndirectLightingIntensity"); + public static readonly int _MetallicIndirectFallback = Shader.PropertyToID("_MetallicIndirectFallback"); + private static readonly int _DebugSwitch = Shader.PropertyToID("_DebugSwitch"); + private static readonly int _BuffersSwitch = Shader.PropertyToID("_BuffersSwitch"); + private static readonly int _Debug_Output = Shader.PropertyToID("_Debug_Output"); + + // Keywords + public static readonly string VR_COMPATIBILITY = "VR_COMPATIBILITY"; + public static readonly string USE_TEMPORAL_INVALIDITY = "USE_TEMPORAL_INVALIDITY"; + public static readonly string USE_RECEIVE_LAYER_MASK = "USE_RECEIVE_LAYER_MASK"; + public static readonly string USE_SPATIAL_OCCLUSION = "USE_SPATIAL_OCCLUSION"; + public static readonly string INTERPOLATION_OUTPUT = "INTERPOLATION_OUTPUT"; + public static readonly string VALIDATE_SPATIAL_OCCLUSION = "VALIDATE_SPATIAL_OCCLUSION"; + public static readonly string AUTOMATIC_THICKNESS = "AUTOMATIC_THICKNESS"; + public static readonly string LINEAR_THICKNESS = "LINEAR_THICKNESS"; + public static readonly string UNIFORM_THICKNESS = "UNIFORM_THICKNESS"; + public static readonly string CHECKERBOARDING = "CHECKERBOARDING"; + public static readonly string FALLBACK_APV = "FALLBACK_APV"; + public static readonly string FALLBACK_SKY = "FALLBACK_SKY"; + public static readonly string FULL_RESOLUTION_DEPTH = "FULL_RESOLUTION_DEPTH"; + public static readonly string REFINE_INTERSECTION = "REFINE_INTERSECTION"; + public static readonly string VALIDATE_TEMPORAL_OCCLUSION = "VALIDATE_TEMPORAL_OCCLUSION"; + public static readonly string VALIDATE_TEMPORAL_LIGHTING = "VALIDATE_TEMPORAL_LIGHTING"; + public static readonly string HALF_STEP_VALIDATION = "HALF_STEP_VALIDATION"; + public static readonly string REPROJECT_TEMPORAL_INVALIDITY = "REPROJECT_TEMPORAL_INVALIDITY"; + public static readonly string AUTOMATIC_BRIGHTNESS_CLAMP = "AUTOMATIC_BRIGHTNESS_CLAMP"; + public static readonly string REPROJECT_SPATIAL_OCCLUSION = "REPROJECT_SPATIAL_OCCLUSION"; + public static readonly string FULL_RESOLUTION_REPROJECTION = "FULL_RESOLUTION_REPROJECTION"; + public static readonly string REPROJECT_COLOR = "REPROJECT_COLOR"; + + // Profiler Samplers + public static ProfilingSampler AmbientLightingOverrideSampler = new ProfilingSampler("Ambient Lighting Override"); + public static ProfilingSampler TemporalReprojectionSampler = new ProfilingSampler("Temporal Reprojection"); + public static ProfilingSampler CheckerboardingSampler = new ProfilingSampler("Checkerboarding"); + public static ProfilingSampler RadianceTracingSampler = new ProfilingSampler("Trace Radiance"); + public static ProfilingSampler RestirTemporalSampler = new ProfilingSampler("ReSTIR Temporal"); + public static ProfilingSampler RestirFireflySampler = new ProfilingSampler("ReSTIR Firefly"); + public static ProfilingSampler RestirSpatialSampler = new ProfilingSampler("ReSTIR Spatial"); + public static ProfilingSampler TemporalAccumulationSampler = new ProfilingSampler("Temporal Accumulation"); + public static ProfilingSampler SpatialFilterSampler = new ProfilingSampler("Spatial Filter"); + public static ProfilingSampler InterpolationSampler = new ProfilingSampler("Interpolation"); + public static ProfilingSampler DebugSampler = new ProfilingSampler("Debug"); + public static ProfilingSampler IndirectLightingInjectionSampler = new ProfilingSampler("Indirect Lighting Injection"); + + // Computes + public static ComputeShader HDebug = null; + public static ComputeShader HRenderSSGI = null; + public static ComputeShader HReSTIR = null; + public static ComputeShader HDenoiser = null; + public static ComputeShader HInterpolation = null; + public static ComputeShader HCheckerboarding = null; + public static ComputeShader PyramidGeneration = null; + public static ComputeShader HTemporalReprojection = null; + + // Materials + public static Material ColorCompose_BIRP; + public static Material ColorCompose_URP; + + // Buffers + public static ComputeBuffer PointDistributionBuffer; + public static ComputeBuffer LuminanceMoments; + public static ComputeBuffer IndirectArguments; + public static ComputeBuffer RayCounter; + public static HDynamicBuffer IndirectCoords; + + // Variables + public static RenderTexture finalOutput; + + internal struct HistoryData : IHistoryData + { + public bool RecurrentBlur; + public float ScaleFactor; + public void Update() + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + RecurrentBlur = profile.DenoisingSettings.RecurrentBlur; + ScaleFactor = Mathf.Round(1.0f / profile.SSGISettings.RenderScale * 100f) / 100f; + } + } + + internal static HistoryData History = new HistoryData(); + + internal static void Execute(CommandBuffer cmd, Camera camera, int cameraWidth, int cameraHeight, RTHandle cameraColorBuffer = null, RTHandle previousColorBuffer = null) + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + + bool UseAPV = false; + bool UseInterpolation = Mathf.Approximately(profile.SSGISettings.RenderScale, 1.0f) ? false : true; + float RenderScaleFactor = (Mathf.Round(1.0f / profile.SSGISettings.RenderScale * 100f) / 100f); + + // Depth to PositionVS parameters + float FovRadians = camera.fieldOfView * Mathf.Deg2Rad; + float TanHalfFOVY = Mathf.Tan(FovRadians * 0.5f); + float invHalfTanFov = 1 / TanHalfFOVY; + Vector2 focalLen = new Vector2(invHalfTanFov * ((float)cameraWidth / (float)cameraWidth), invHalfTanFov); + Vector2 invFocalLen = new Vector2(1 / focalLen.x, 1 / focalLen.y); + Vector4 DepthToViewParams = new Vector4(2 * invFocalLen.x, 2 * invFocalLen.y, -1 * invFocalLen.x, -1 * invFocalLen.y); + + // Tracing thickness management + float Thickness = Mathf.Clamp(profile.SSGISettings.Thickness, 0.05f, 1.0f); + float n = camera.nearClipPlane; + float f = camera.farClipPlane; + Vector4 ThicknessScaleBias = new Vector4(); + ThicknessScaleBias.x = 1.0f / (1.0f + Thickness / 5.0f); + ThicknessScaleBias.y = -n / (f - n) * (Thickness / 5.0f * ThicknessScaleBias.x); + ThicknessScaleBias.z = 1.0f / (1.0f + Thickness / 5.0f * 2.0f); + ThicknessScaleBias.w = -n / (f - n) * (Thickness / 5.0f * 2.0f * ThicknessScaleBias.z); + + if ((int)profile.SSGISettings.ThicknessMode == 1) + { + ThicknessScaleBias.x = 1.0f; + ThicknessScaleBias.y = Thickness; + ThicknessScaleBias.z = 1.0f; + ThicknessScaleBias.w = Thickness * 2.0f; + } + + // Spatial radius management + float FilterRadiusReSTIR = profile.DenoisingSettings.SpatialRadius - 0.25f; // HData.DenoisingData.SpatialRadius / 2.0f; + float FilterRadiusDenoiser = FilterRadiusReSTIR * 0.7f; + FilterRadiusReSTIR = FilterRadiusReSTIR.RoundToCeilTail(1); + FilterRadiusDenoiser = FilterRadiusDenoiser.RoundToCeilTail(1); + + + + // ---------------------------------------- PARAMETERS SET ---------------------------------------- // + cmd.SetGlobalVector(_DepthToViewParams, DepthToViewParams); + cmd.SetGlobalFloat(_HScaleFactorSSGI, RenderScaleFactor); + cmd.SetGlobalFloat(_HPreviousScaleFactorSSGI, History.ScaleFactor); + cmd.SetGlobalFloat(_ReservoirDiffuseWeight, profile.GeneralSettings.DebugMode == DebugMode.GlobalIllumination ? 0.0f : 1.0f); + +#if UNITY_2023_3_OR_NEWER + cmd.SetGlobalInt(_ExcludeCastingLayerMaskSSGI, profile.GeneralSettings.ExcludeCastingMask); + cmd.SetGlobalInt(_ExcludeReceivingLayerMaskSSGI, profile.GeneralSettings.ExcludeReceivingMask); +#endif + + cmd.SetGlobalVector(_APVParams, new Vector4(profile.GeneralSettings.NormalBias, profile.GeneralSettings.ViewBias, profile.GeneralSettings.SamplingNoise, profile.GeneralSettings.IntensityMultiplier)); + + cmd.SetComputeFloatParam(HTemporalReprojection, _BrightnessClamp, profile.DenoisingSettings.MaxValueBrightnessClamp); + cmd.SetComputeFloatParam(HTemporalReprojection, _MaxDeviation, profile.DenoisingSettings.MaxDeviationBrightnessClamp); + + cmd.SetComputeIntParam(HRenderSSGI, _RayCount, profile.SSGISettings.RayCount); + cmd.SetComputeIntParam(HRenderSSGI, _StepCount, profile.SSGISettings.StepCount); + cmd.SetComputeFloatParam(HRenderSSGI, _RayLength, Mathf.Max(profile.SSGISettings.MaxRayLength, 0.1f)); + cmd.SetComputeFloatParam(HRenderSSGI, _BackfaceLighting, profile.SSGISettings.BackfaceLighting); + cmd.SetComputeFloatParam(HRenderSSGI, _SkyFallbackIntensity, profile.GeneralSettings.SkyIntensity); + cmd.SetComputeFloatParam(HRenderSSGI, _Falloff, profile.SSGISettings.Falloff); + cmd.SetComputeVectorParam(HRenderSSGI, _ThicknessParams, ThicknessScaleBias); + + cmd.SetComputeIntParam(HReSTIR, _DenoiseFallback, (profile.GeneralSettings.DenoiseFallback || profile.GeneralSettings.FallbackType == FallbackType.None) ? 1 : 0); + cmd.SetComputeIntParam(HReSTIR, _RayCount, profile.SSGISettings.RayCount); + cmd.SetComputeIntParam(HReSTIR, _StepCount, profile.SSGISettings.StepCount); + cmd.SetComputeFloatParam(HReSTIR, _RayLength, Mathf.Max(profile.SSGISettings.MaxRayLength, 0.1f)); + cmd.SetComputeFloatParam(HReSTIR, _BackfaceLighting, profile.SSGISettings.BackfaceLighting); + cmd.SetComputeFloatParam(HReSTIR, _FilterAdaptivity, profile.DenoisingSettings.Adaptivity); + cmd.SetComputeFloatParam(HReSTIR, _Falloff, profile.SSGISettings.Falloff); + cmd.SetComputeFloatParam(HReSTIR, _FilterRadius, FilterRadiusReSTIR); + cmd.SetComputeVectorParam(HReSTIR, _ThicknessParams, ThicknessScaleBias); + + cmd.SetComputeFloatParam(HDenoiser, _FilterAdaptivity, profile.DenoisingSettings.Adaptivity); + cmd.SetComputeFloatParam(HDenoiser, _FilterRadius, FilterRadiusDenoiser); + cmd.SetComputeFloatParam(HDenoiser, _StepCount, profile.SSGISettings.StepCount); + + RTWrapper ColorPreviousFrame = CameraHistorySystem.GetCameraData().ColorPreviousFrame; + RTWrapper ReservoirTemporal = CameraHistorySystem.GetCameraData().ReservoirTemporal; + RTWrapper SampleCount = CameraHistorySystem.GetCameraData().SampleCount; + RTWrapper NormalDepth = CameraHistorySystem.GetCameraData().NormalDepth; + RTWrapper NormalDepthFullRes = CameraHistorySystem.GetCameraData().NormalDepthFullRes; + RTWrapper Radiance = CameraHistorySystem.GetCameraData().Radiance; + RTWrapper RadianceAccumulated = CameraHistorySystem.GetCameraData().RadianceAccumulated; + RTWrapper SpatialOcclusionAccumulated = CameraHistorySystem.GetCameraData().SpatialOcclusionAccumulated; + RTWrapper TemporalInvalidityAccumulated = CameraHistorySystem.GetCameraData().TemporalInvalidityAccumulated; + RTWrapper AmbientOcclusionAccumulated = CameraHistorySystem.GetCameraData().AmbientOcclusionAccumulated; + + + // ---------------------------------------- TEMPORAL REPROJECTION ---------------------------------------- // + using (new ProfilingScope(cmd, TemporalReprojectionSampler)) + { + var CurrentColorBuffer = ColorPreviousFrame.rt; + var PreviousColorBuffer = ColorPreviousFrame.rt; + + CurrentColorBuffer = cameraColorBuffer; + + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.LuminanceMomentsGeneration, _Color_History, profile.GeneralSettings.Multibounce ? PreviousColorBuffer : CurrentColorBuffer); + cmd.SetComputeBufferParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.LuminanceMomentsGeneration, _LuminanceMoments, LuminanceMoments); + cmd.DispatchCompute(HTemporalReprojection, (int)HTemporalReprojectionKernels.LuminanceMomentsGeneration, Mathf.CeilToInt(cameraWidth / 8.0f), Mathf.CeilToInt(cameraHeight / 8.0f), 1); + + KeywordSwitch(HTemporalReprojection, profile.DenoisingSettings.TemporalLightingValidation | profile.DenoisingSettings.TemporalOcclusionValidation, REPROJECT_TEMPORAL_INVALIDITY); + KeywordSwitch(HTemporalReprojection, profile.DenoisingSettings.BrightnessClamp == BrightnessClamp.Automatic, AUTOMATIC_BRIGHTNESS_CLAMP); + KeywordSwitch(HTemporalReprojection, profile.DenoisingSettings.SpatialOcclusionValidation, REPROJECT_SPATIAL_OCCLUSION); + KeywordSwitch(HTemporalReprojection, UseInterpolation == false, FULL_RESOLUTION_REPROJECTION); + KeywordSwitch(HTemporalReprojection, profile.GeneralSettings.Multibounce, REPROJECT_COLOR); + + if (UseInterpolation) + { + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, _Color_History, PreviousColorBuffer); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, _Radiance_History, RadianceStabilized.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, _Radiance_Output, RadianceStabilizedReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, _NormalDepth_History, NormalDepthFullRes.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, _ReprojectedColor_Output, ColorReprojected.rt); + cmd.SetComputeBufferParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, _LuminanceMoments, LuminanceMoments); + cmd.DispatchCompute(HTemporalReprojection, (int)HTemporalReprojectionKernels.ColorReprojection, Mathf.CeilToInt(cameraWidth / 8.0f), Mathf.CeilToInt(cameraHeight / 8.0f), HRenderer.TextureXrSlices); + } + + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Color_History, PreviousColorBuffer); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Samplecount_History, SampleCount.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Samplecount_Output, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _NormalDepth_History, NormalDepth.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _ReprojectedColor_Output, ColorReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Radiance_Output, RadianceReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Radiance_History, profile.DenoisingSettings.RecurrentBlur ? Radiance.rt : RadianceAccumulated.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _SpatialOcclusion_History, SpatialOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _SpatialOcclusion_Output, SpatialOcclusionReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Reservoir, ReservoirTemporal.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _Reservoir_Output, ReservoirReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _TemporalInvalidity_History, TemporalInvalidityAccumulated.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _TemporalInvalidity_Output, TemporalInvalidityReprojected.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _AmbientOcclusion_History, AmbientOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _AmbientOcclusion_Output, AmbientOcclusionReprojected.rt); + cmd.SetComputeBufferParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, _LuminanceMoments, LuminanceMoments); + cmd.DispatchCompute(HTemporalReprojection, (int)HTemporalReprojectionKernels.TemporalReprojection, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + + cmd.SetComputeBufferParam(HTemporalReprojection, (int)HTemporalReprojectionKernels.LuminanceMomentsClear, _LuminanceMoments, LuminanceMoments); + cmd.DispatchCompute(HTemporalReprojection, (int)HTemporalReprojectionKernels.LuminanceMomentsClear, 1, 1, 1); + } + + + // ---------------------------------------- CHECKERBOARDING ---------------------------------------- // + if (profile.SSGISettings.Checkerboard) + { + using (new ProfilingScope(cmd, CheckerboardingSampler)) + { + cmd.SetComputeTextureParam(HCheckerboarding, (int)HCheckerboardingKernels.CheckerboardClassification, _SampleCount, SamplecountReprojected.rt); + cmd.SetComputeBufferParam(HCheckerboarding, (int)HCheckerboardingKernels.CheckerboardClassification, _RayCounter_Output, RayCounter); + cmd.SetComputeBufferParam(HCheckerboarding, (int)HCheckerboardingKernels.CheckerboardClassification, _IndirectCoords_Output, IndirectCoords.ComputeBuffer); + cmd.DispatchCompute(HCheckerboarding, (int)HCheckerboardingKernels.CheckerboardClassification, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + + cmd.SetComputeIntParam(HCheckerboarding, _RayTracedCounter, 0); + cmd.SetComputeBufferParam(HCheckerboarding, (int)HCheckerboardingKernels.IndirectArguments, _RayCounter, RayCounter); + cmd.SetComputeBufferParam(HCheckerboarding, (int)HCheckerboardingKernels.IndirectArguments, _IndirectArguments_Output, IndirectArguments); + cmd.DispatchCompute(HCheckerboarding, (int)HCheckerboardingKernels.IndirectArguments, 1, 1, HRenderer.TextureXrSlices); + } + } + + + // ---------------------------------------- GI TRACING ---------------------------------------- // + using (new ProfilingScope(cmd, RadianceTracingSampler)) + { + CoreUtils.SetRenderTarget(cmd, RadianceFiltered.rt, ClearFlag.Color, Color.clear, 0, CubemapFace.Unknown, -1); + + KeywordSwitch(HRenderSSGI, profile.GeneralSettings.FallbackType == FallbackType.Sky, FALLBACK_SKY); + KeywordSwitch(HRenderSSGI, (int)profile.GeneralSettings.FallbackType == 2 /* Only in HDRP & URP 6000+ */, FALLBACK_APV); + KeywordSwitch(HRenderSSGI, profile.SSGISettings.Checkerboard, CHECKERBOARDING); + KeywordSwitch(HRenderSSGI, profile.SSGISettings.RefineIntersection, REFINE_INTERSECTION); + KeywordSwitch(HRenderSSGI, profile.SSGISettings.FullResolutionDepth, FULL_RESOLUTION_DEPTH); + + if ((int)profile.SSGISettings.ThicknessMode == 0) {HRenderSSGI.EnableKeyword(LINEAR_THICKNESS); HRenderSSGI.DisableKeyword(UNIFORM_THICKNESS); HRenderSSGI.DisableKeyword(AUTOMATIC_THICKNESS);} + if ((int)profile.SSGISettings.ThicknessMode == 1) {HRenderSSGI.EnableKeyword(UNIFORM_THICKNESS); HRenderSSGI.DisableKeyword(LINEAR_THICKNESS); HRenderSSGI.DisableKeyword(AUTOMATIC_THICKNESS);} + + cmd.SetComputeTextureParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _Color, ColorReprojected.rt); + cmd.SetComputeTextureParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _Radiance_Output, RadianceFiltered.rt); + cmd.SetComputeTextureParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _Reservoir_Output, Reservoir.rt); + cmd.SetComputeTextureParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _AmbientOcclusion_Output, AmbientOcclusion.rt); + cmd.SetComputeTextureParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _SampleCount, SamplecountReprojected.rt); + cmd.SetComputeBufferParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _RayCounter, RayCounter); + cmd.SetComputeBufferParam(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, _TracingCoords, IndirectCoords.ComputeBuffer); + + if (profile.SSGISettings.Checkerboard) + { + cmd.SetComputeIntParam(HRenderSSGI, HShaderParams.IndexXR, 0); + cmd.DispatchCompute(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, IndirectArguments, 0); + + if (HRenderer.TextureXrSlices > 1) + { + cmd.SetComputeIntParam(HRenderSSGI, HShaderParams.IndexXR, 1); + cmd.DispatchCompute(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, IndirectArguments, sizeof(uint) * 3); + } + } + else cmd.DispatchCompute(HRenderSSGI, (int)HRenderSSGIKernels.TraceSSGI, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + } + + + // ---------------------------------------- RESTIR TEMPORAL ---------------------------------------- // + using (new ProfilingScope(cmd, RestirTemporalSampler)) + { + KeywordSwitch(HReSTIR, profile.DenoisingSettings.TemporalOcclusionValidation, VALIDATE_TEMPORAL_OCCLUSION); + KeywordSwitch(HReSTIR, profile.DenoisingSettings.TemporalLightingValidation, VALIDATE_TEMPORAL_LIGHTING); + KeywordSwitch(HReSTIR, profile.DenoisingSettings.HalfStepValidation, HALF_STEP_VALIDATION); + KeywordSwitch(HReSTIR, profile.SSGISettings.FullResolutionDepth, FULL_RESOLUTION_DEPTH); + KeywordSwitch(HReSTIR, profile.SSGISettings.Checkerboard, CHECKERBOARDING); + + if ((int)profile.SSGISettings.ThicknessMode == 0) {HReSTIR.EnableKeyword(LINEAR_THICKNESS); HReSTIR.DisableKeyword(UNIFORM_THICKNESS); HReSTIR.DisableKeyword(AUTOMATIC_THICKNESS);} + if ((int)profile.SSGISettings.ThicknessMode == 1) {HReSTIR.EnableKeyword(UNIFORM_THICKNESS); HReSTIR.DisableKeyword(LINEAR_THICKNESS); HReSTIR.DisableKeyword(AUTOMATIC_THICKNESS);} + + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _Radiance_Output, RadianceFiltered.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _SampleCount, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _Color, ColorReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _AmbientOcclusion, AmbientOcclusion.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _AmbientOcclusionInvalidity, AmbientOcclusionInvalidity.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _AmbientOcclusionReprojected, AmbientOcclusionReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _AmbientOcclusion_Output, AmbientOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _SpatialOcclusion, SpatialOcclusionReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _Reservoir, Reservoir.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _ReservoirReprojected, ReservoirReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _ReservoirSpatial_Output, ReservoirSpatial.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _ReservoirTemporal_Output, ReservoirTemporal.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _TemporalInvalidity, TemporalInvalidityReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _TemporalInvalidity_Output, TemporalInvalidityAccumulated.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _NormalDepth_HistoryOutput, NormalDepth.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _ReservoirLuminance_Output, ReservoirLuminance.rt); + cmd.SetComputeBufferParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _RayCounter, RayCounter); + cmd.SetComputeBufferParam(HReSTIR, (int)HReSTIRKernels.TemporalResampling, _TracingCoords, IndirectCoords.ComputeBuffer); + cmd.DispatchCompute(HReSTIR, (int)HReSTIRKernels.TemporalResampling, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + } + + + // ---------------------------------------- RESTIR FIREFLY ---------------------------------------- // + using (new ProfilingScope(cmd, RestirFireflySampler)) + { + if (profile.DenoisingSettings.FireflySuppression) + { + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.FireflySuppression, _SampleCount, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.FireflySuppression, _ReservoirLuminance, ReservoirLuminance.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.FireflySuppression, _ReservoirSpatial_Output, ReservoirSpatial.rt); + cmd.DispatchCompute(HReSTIR, (int)HReSTIRKernels.FireflySuppression, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + } + } + + + // ---------------------------------------- RESTIR SPATIAL ---------------------------------------- // + using (new ProfilingScope(cmd, RestirSpatialSampler)) + { + KeywordSwitch(HReSTIR, profile.DenoisingSettings.SpatialOcclusionValidation, VALIDATE_SPATIAL_OCCLUSION); + KeywordSwitch(HReSTIR, HRenderer.TextureXrSlices > 1, VR_COMPATIBILITY); + + cmd.SetComputeBufferParam(HDenoiser, (int)HDenoiserKernels.PointDistributionFill, _PointDistribution_Output, PointDistributionBuffer); + cmd.DispatchCompute(HDenoiser, (int)HDenoiserKernels.PointDistributionFill, 1, 1, 1); + + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _Reservoir, ReservoirSpatial.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _Reservoir_Output, Reservoir.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _SampleCount, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _TemporalInvalidity, TemporalInvalidityAccumulated.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _TemporalInvalidity_Output, TemporalInvalidityFilteredA.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _AmbientOcclusion, AmbientOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _SpatialGuidance_Output, AmbientOcclusionGuidance.rt); + cmd.SetComputeBufferParam(HReSTIR, (int)HReSTIRKernels.SpatialResampling, _PointDistribution, PointDistributionBuffer); + cmd.DispatchCompute(HReSTIR, (int)HReSTIRKernels.SpatialResampling, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _Color, ColorReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _Radiance_Output, Radiance.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _SampleCount, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _AmbientOcclusion, AmbientOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _Reservoir, Reservoir.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _Reservoir_Output, ReservoirSpatial.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _SpatialOcclusion, SpatialOcclusionReprojected.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _SpatialOcclusion_Output, SpatialOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _TemporalInvalidity, TemporalInvalidityFilteredA.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _TemporalInvalidity_Output, TemporalInvalidityFilteredB.rt); + cmd.SetComputeTextureParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _SpatialGuidance, AmbientOcclusionGuidance.rt); + cmd.SetComputeBufferParam(HReSTIR, (int)HReSTIRKernels.SpatialValidation, _PointDistribution, PointDistributionBuffer); + cmd.DispatchCompute(HReSTIR, (int)HReSTIRKernels.SpatialValidation, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + } + + + // ---------------------------------------- DENOISER TEMPORAL ---------------------------------------- // + using (new ProfilingScope(cmd, TemporalAccumulationSampler)) + { + KeywordSwitch(HDenoiser, profile.DenoisingSettings.TemporalLightingValidation | profile.DenoisingSettings.TemporalOcclusionValidation, USE_TEMPORAL_INVALIDITY); + KeywordSwitch(HDenoiser, HRenderer.TextureXrSlices > 1, VR_COMPATIBILITY); + + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _TemporalInvalidity, TemporalInvalidityFilteredB.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _SamplecountReprojected, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _Samplecount_Output, SampleCount.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _Radiance, Radiance.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _RadianceReprojected, RadianceReprojected.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _Radiance_TemporalOutput, RadianceAccumulated.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, _Radiance_SpatialOutput, RadianceFiltered.rt); + cmd.DispatchCompute(HDenoiser, (int)HDenoiserKernels.TemporalAccumulation, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + } + + + // ---------------------------------------- DENOISER SPATIAL ---------------------------------------- // + using (new ProfilingScope(cmd, SpatialFilterSampler)) + { + KeywordSwitch(HDenoiser, profile.DenoisingSettings.SpatialOcclusionValidation, USE_SPATIAL_OCCLUSION); + KeywordSwitch(HDenoiser, UseInterpolation, INTERPOLATION_OUTPUT); + + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _NormalDepth, NormalDepth.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _SpatialGuidance, AmbientOcclusionGuidance.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _AmbientOcclusion, AmbientOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _Radiance, RadianceFiltered.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _Radiance_Output, Radiance.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _SpatialOcclusion, SpatialOcclusionAccumulated.rt); + cmd.SetComputeBufferParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, _PointDistribution, PointDistributionBuffer); + cmd.DispatchCompute(HDenoiser, (int)HDenoiserKernels.SpatialFilter1, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _NormalDepth, NormalDepth.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _SpatialGuidance, AmbientOcclusionGuidance.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _AmbientOcclusion, AmbientOcclusionAccumulated.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _Radiance, Radiance.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _Radiance_Output, RadianceFiltered.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _RadianceNormalDepth_Output, RadianceNormalDepth.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _SpatialOcclusion, SpatialOcclusionAccumulated.rt); + cmd.SetComputeBufferParam(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, _PointDistribution, PointDistributionBuffer); + cmd.DispatchCompute(HDenoiser, (int)HDenoiserKernels.SpatialFilter2, Mathf.CeilToInt(cameraWidth / RenderScaleFactor / 8.0f), Mathf.CeilToInt(cameraHeight / RenderScaleFactor / 8.0f), HRenderer.TextureXrSlices); + } + + + // ---------------------------------------- INTERPOLATION SPATIAL ---------------------------------------- // + using (new ProfilingScope(cmd, InterpolationSampler)) + { + if (UseInterpolation) + { + KeywordSwitch(HInterpolation, HRenderer.TextureXrSlices > 1, VR_COMPATIBILITY); + + // Interpolation + cmd.SetComputeTextureParam(HInterpolation, (int)HInterpolationKernels.Interpolation, _RadianceNormalDepth, RadianceNormalDepth.rt); + cmd.SetComputeTextureParam(HInterpolation, (int)HInterpolationKernels.Interpolation, _Radiance_Output, RadianceInterpolated.rt); + cmd.SetComputeTextureParam(HInterpolation, (int)HInterpolationKernels.Interpolation, _NormalDepth_HistoryOutput, NormalDepthFullRes.rt); + cmd.DispatchCompute(HInterpolation, (int)HInterpolationKernels.Interpolation, Mathf.CeilToInt(cameraWidth / 8.0f), Mathf.CeilToInt(cameraHeight / 8.0f), HRenderer.TextureXrSlices); + + // Stabilization + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalStabilization, _TemporalInvalidity, TemporalInvalidityFilteredB.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalStabilization, _SamplecountReprojected, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalStabilization, _Radiance, RadianceInterpolated.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalStabilization, _RadianceReprojected, RadianceStabilizedReprojected.rt); + cmd.SetComputeTextureParam(HDenoiser, (int)HDenoiserKernels.TemporalStabilization, _Radiance_TemporalOutput, RadianceStabilized.rt); + cmd.DispatchCompute(HDenoiser, (int)HDenoiserKernels.TemporalStabilization, Mathf.CeilToInt(cameraWidth / 8.0f), Mathf.CeilToInt(cameraHeight / 8.0f), HRenderer.TextureXrSlices); + } + } + + finalOutput = Mathf.Approximately(profile.SSGISettings.RenderScale, 1.0f) ? SSGI.RadianceFiltered.rt : SSGI.RadianceInterpolated.rt; + + // --------------------------------------------- DEBUG ----------------------------------------------- // + using (new ProfilingScope(cmd, DebugSampler)) + { + if (profile.GeneralSettings.DebugMode != DebugMode.None && profile.GeneralSettings.DebugMode != DebugMode.DirectLighting) + { + cmd.SetComputeIntParams(HDebug, _DebugSwitch, (int)profile.GeneralSettings.DebugMode); + cmd.SetComputeIntParams(HDebug, _BuffersSwitch, (int)profile.GeneralSettings.HBuffer); + cmd.SetComputeTextureParam(HDebug, 0, _Debug_Output, DebugOutput.rt); + cmd.SetComputeTextureParam(HDebug, 0, _SampleCountSSGI, SamplecountReprojected.rt); + cmd.SetComputeTextureParam(HDebug, 0, _HTraceBufferGI, finalOutput); + cmd.DispatchCompute(HDebug, 0, Mathf.CeilToInt(cameraWidth / 8.0f), Mathf.CeilToInt(cameraHeight / 8.0f), HRenderer.TextureXrSlices); + + cmd.SetGlobalTexture(_Debug_Output, DebugOutput.rt); + } + } + } + + private static void KeywordSwitch(ComputeShader compute, bool state, string keyword) + { + if (state) + compute.EnableKeyword(keyword); + else + compute.DisableKeyword(keyword); + } + } + +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs.meta new file mode 100644 index 0000000..4db81ef --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 899f5117c46144a4bd16bfff7845aff3 +timeCreated: 1745928754 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/Shared/SSGI.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP.meta new file mode 100644 index 0000000..609b57a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e4b8bb5cb72847444bf29135c1e77513 +timeCreated: 1729952262 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs new file mode 100644 index 0000000..f8eb83a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs @@ -0,0 +1,110 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Passes.Shared; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Infrastructure.URP; +using HTraceSSGI.Scripts.Wrappers; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +#if UNITY_2023_3_OR_NEWER +using UnityEngine.Rendering.RenderGraphModule; +#endif + +namespace HTraceSSGI.Scripts.Passes.URP +{ + internal class FinalPassURP : ScriptableRenderPass + { + private ScriptableRenderer _renderer; + + #region --------------------------- Non Render Graph --------------------------- + protected internal void Initialize(ScriptableRenderer renderer) + { + _renderer = renderer; + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) + { + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + var cmd = CommandBufferPool.Get(HNames.HTRACE_FINAL_PASS_NAME); + + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + if (profile.GeneralSettings.DebugMode != DebugMode.None && profile.GeneralSettings.DebugMode != DebugMode.DirectLighting) + { + Blitter.BlitCameraTexture(cmd, SSGI.DebugOutput.rt, _renderer.cameraColorTargetHandle); + } + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + } + #endregion --------------------------- Non Render Graph --------------------------- + + #region --------------------------- Render Graph --------------------------- + +#if UNITY_2023_3_OR_NEWER + private class PassData + { + public TextureHandle ColorTexture; + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + using (var builder = renderGraph.AddUnsafePass(HNames.HTRACE_FINAL_PASS_NAME, out var passData, new ProfilingSampler(HNames.HTRACE_FINAL_PASS_NAME))) + { + UniversalResourceData resourceData = frameData.Get(); + UniversalRenderingData universalRenderingData = frameData.Get(); + + builder.AllowGlobalStateModification(true); + builder.AllowPassCulling(false); + + passData.ColorTexture = universalRenderingData.renderingMode == RenderingMode.Deferred ? resourceData.activeColorTexture : resourceData.cameraColor; + + builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context)); + } + } + + private static void ExecutePass(PassData data, UnsafeGraphContext rgContext) + { + var cmd = CommandBufferHelpers.GetNativeCommandBuffer(rgContext.cmd); + + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + if (profile.GeneralSettings.DebugMode != DebugMode.None && profile.GeneralSettings.DebugMode != DebugMode.DirectLighting) + { + Blitter.BlitCameraTexture(cmd, SSGI.DebugOutput.rt, data.ColorTexture); + } + } +#endif + #endregion --------------------------- Render Graph --------------------------- + + #region --------------------------- Shared --------------------------- + + protected internal void Dispose() + { + } + + #endregion --------------------------- Shared --------------------------- + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs.meta new file mode 100644 index 0000000..9c1223e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 38d0808db5cb55c4b820dedf6eaec8aa +timeCreated: 1729952288 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/URP/FinalPassURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs new file mode 100644 index 0000000..abf391d --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs @@ -0,0 +1,498 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Infrastructure.URP; +using HTraceSSGI.Scripts.Wrappers; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using UnityEngine.Rendering.RendererUtils; +using UnityEngine.Rendering.Universal; + +#if UNITY_2023_3_OR_NEWER +using UnityEngine.Rendering.RenderGraphModule; +#endif + +namespace HTraceSSGI.Scripts.Passes.URP +{ + internal class GBufferPassURP : ScriptableRenderPass + { + // Texture Names + private const string _Dummy = "_Dummy"; + private const string _DepthPyramid = "_DepthPyramid"; + private const string _ForwardGBuffer0 = "_ForwardGBuffer0"; + private const string _ForwardGBuffer1 = "_ForwardGBuffer1"; + private const string _ForwardGBuffer2 = "_ForwardGBuffer2"; + private const string _ForwardGBuffer3 = "_ForwardGBuffer3"; + private const string _ForwardRenderLayerMask = "_ForwardRenderLayerMask"; + private const string _ForwardGBufferDepth = "_ForwardGBufferDepth"; + + // Materials & Computes + internal static ComputeShader HDepthPyramid = null; + + // Samplers + internal static readonly ProfilingSampler GBufferProfilingSampler = new("GBuffer"); + private static readonly ProfilingSampler DepthPyramidGenerationProfilingSampler = new ProfilingSampler("Depth Pyramid Generation"); + + // Textures + internal static RTWrapper Dummy = new RTWrapper(); + internal static RTWrapper ForwardGBuffer0 = new RTWrapper(); + internal static RTWrapper ForwardGBuffer1 = new RTWrapper(); + internal static RTWrapper ForwardGBuffer2 = new RTWrapper(); + internal static RTWrapper ForwardGBuffer3 = new RTWrapper(); + internal static RTWrapper ForwardRenderLayerMask = new RTWrapper(); + internal static RTWrapper ForwardGBufferDepth = new RTWrapper(); + internal static RTWrapper DepthPyramidRT = new RTWrapper(); + + // MRT Arrays + internal static RenderTargetIdentifier[] GBufferMRT = null; + + // Misc + internal static RenderStateBlock ForwardGBufferRenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); + + #region --------------------------- Non Render Graph --------------------------- + + private ScriptableRenderer _renderer; + + protected internal void Initialize(ScriptableRenderer renderer) + { + _renderer = renderer; + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + Setup(renderingData.cameraData.camera, renderingData.cameraData.renderScale, renderingData.cameraData.cameraTargetDescriptor); + } + + private static void Setup(Camera camera, float renderScale, RenderTextureDescriptor desc) + { + if (HDepthPyramid == null) HDepthPyramid = HExtensions.LoadComputeShader("HDepthPyramid"); + + int width = (int)(camera.scaledPixelWidth * renderScale); + int height = (int)(camera.scaledPixelHeight * renderScale); + + if (desc.width != width || desc.height != height) + desc = new RenderTextureDescriptor(width, height); + desc.depthBufferBits = 0; // Color and depth cannot be combined in RTHandles + desc.stencilFormat = GraphicsFormat.None; + desc.depthStencilFormat = GraphicsFormat.None; + desc.msaaSamples = 1; + desc.bindMS = false; + + var graphicsFormatRenderingLayerMask = GraphicsFormat.R8G8B8A8_UNorm; + + #if UNITY_6000_2_OR_NEWER + graphicsFormatRenderingLayerMask = GraphicsFormat.R8G8_UInt; + #endif + + ForwardGBuffer0.ReAllocateIfNeeded(_ForwardGBuffer0, ref desc, graphicsFormat: GraphicsFormat.R8G8B8A8_SRGB); + ForwardGBuffer1.ReAllocateIfNeeded(_ForwardGBuffer1, ref desc, graphicsFormat: GraphicsFormat.R8G8B8A8_UNorm); + ForwardGBuffer2.ReAllocateIfNeeded(_ForwardGBuffer2, ref desc, graphicsFormat: GraphicsFormat.R8G8B8A8_SNorm); + ForwardGBuffer3.ReAllocateIfNeeded(_ForwardGBuffer3, ref desc, graphicsFormat: GraphicsFormat.B10G11R11_UFloatPack32); + ForwardRenderLayerMask.ReAllocateIfNeeded(_ForwardRenderLayerMask, ref desc, graphicsFormat: graphicsFormatRenderingLayerMask); + DepthPyramidRT.ReAllocateIfNeeded(_DepthPyramid, ref desc, graphicsFormat: GraphicsFormat.R16_SFloat, useMipMap: true); + + RenderTextureDescriptor depthDesc = desc; + depthDesc.depthBufferBits = 32; + depthDesc.depthStencilFormat = GraphicsFormat.None; + ForwardGBufferDepth.ReAllocateIfNeeded(_ForwardGBufferDepth, ref depthDesc, graphicsFormat: GraphicsFormat.R16_SFloat, useMipMap: false, enableRandomWrite: false); + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) + { + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + Camera camera = renderingData.cameraData.camera; + + var cmd = CommandBufferPool.Get(HNames.HTRACE_GBUFFER_PASS_NAME); + + int width = (int)(camera.scaledPixelWidth * renderingData.cameraData.renderScale); + int height = (int)(camera.scaledPixelHeight * renderingData.cameraData.renderScale); + + var nativeGBuffer0 = Shader.GetGlobalTexture(HShaderParams._GBuffer0); + var nativeGBuffer1 = Shader.GetGlobalTexture(HShaderParams._GBuffer1); + var nativeGBuffer2 = Shader.GetGlobalTexture(HShaderParams._GBuffer2); + var renderLayerMaskTexture = Shader.GetGlobalTexture(HShaderParams._CameraRenderingLayersTexture); + var screenSpaceOcclusionTexture = Shader.GetGlobalTexture(HShaderParams.g_ScreenSpaceOcclusionTexture); + + // Set Depth, Color and SSAO to HTrace passes + cmd.SetGlobalTexture(HShaderParams.g_HTraceColor, _renderer.cameraColorTargetHandle); + cmd.SetGlobalTexture(HShaderParams.g_HTraceDepth, _renderer.cameraDepthTargetHandle); + cmd.SetGlobalTexture(HShaderParams.g_HTraceSSAO, screenSpaceOcclusionTexture == null ? Texture2D.whiteTexture : screenSpaceOcclusionTexture); + + GBufferGenerationNonRenderGraph(cmd, width, height, nativeGBuffer0, nativeGBuffer1, nativeGBuffer2, renderLayerMaskTexture, _renderer.cameraColorTargetHandle, _renderer.cameraDepthTargetHandle, ref context, ref renderingData); + + GenerateDepthPyramidShared(cmd, width, height, DepthPyramidRT.rt); + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + } + + + private static void GBufferGenerationNonRenderGraph(CommandBuffer cmd, int width, int height, Texture nativeGBuffer0, Texture nativeGBuffer1, + Texture nativeGBuffer2, Texture renderLayerMask, RTHandle cameraColorBuffer, RTHandle cameraDepthBuffer, + ref ScriptableRenderContext context, ref RenderingData renderingData) + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + var camera = renderingData.cameraData.camera; + using (new ProfilingScope(cmd, GBufferProfilingSampler)) + { + // Set sky probe management + SphericalHarmonicsL2 ambientProbe = RenderSettings.ambientProbe; + cmd.SetGlobalVector(HShaderParams.H_SHAr, new Vector4(ambientProbe[0, 3], ambientProbe[0, 1], ambientProbe[0, 2], ambientProbe[0, 0] - ambientProbe[0, 6])); + cmd.SetGlobalVector(HShaderParams.H_SHAg, new Vector4(ambientProbe[1, 3], ambientProbe[1, 1], ambientProbe[1, 2], ambientProbe[1, 0] - ambientProbe[1, 6])); + cmd.SetGlobalVector(HShaderParams.H_SHAb, new Vector4(ambientProbe[2, 3], ambientProbe[2, 1], ambientProbe[2, 2], ambientProbe[2, 0] - ambientProbe[2, 6])); + cmd.SetGlobalVector(HShaderParams.H_SHBr, new Vector4(ambientProbe[0, 4], ambientProbe[0, 5], ambientProbe[0, 6] * 3, ambientProbe[0, 7])); + cmd.SetGlobalVector(HShaderParams.H_SHBg, new Vector4(ambientProbe[1, 4], ambientProbe[1, 5], ambientProbe[1, 6] * 3, ambientProbe[1, 7])); + cmd.SetGlobalVector(HShaderParams.H_SHBb, new Vector4(ambientProbe[2, 4], ambientProbe[2, 5], ambientProbe[2, 6] * 3, ambientProbe[2, 7])); + cmd.SetGlobalVector(HShaderParams.H_SHC, new Vector4(ambientProbe[0, 8], ambientProbe[1, 8], ambientProbe[2, 8], 1)); + + // Check if GBuffer is valid (e.g. Forward / wrong scale / is not set, etc.) + bool RequestForwardGBufferRender = false; + if (nativeGBuffer0 == null || nativeGBuffer1 == null || nativeGBuffer2 == null) + { RequestForwardGBufferRender = true; } + else if ( nativeGBuffer0.width != width || nativeGBuffer0.height != height) // CameraDepthBuffer.rtHandleProperties.currentViewportSize.x + { RequestForwardGBufferRender = true; } + + // Set Render Layer Mask to black dummy in case it's disabled as a feature and we can't render it + if (renderLayerMask == null) + renderLayerMask = Texture2D.blackTexture;// Dummy.rt; + + // RequestForwardGBufferRender = true; + + // GBuffer can't be rendered because its resolution doesn't match the resolution of Unity's depth buffer. Happens when switching between Scene and Game windows + if (ForwardGBuffer0.rt.rt.width != cameraDepthBuffer.rt.width || ForwardGBuffer0.rt.rt.height != cameraDepthBuffer.rt.height) + { + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer0, ForwardGBuffer0.rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer1, ForwardGBuffer1.rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer2, ForwardGBuffer2.rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceRenderLayerMask, ForwardRenderLayerMask.rt); + return; + } + + // Set GBuffer to HTrace passes if valid or render it otherwise + if (RequestForwardGBufferRender == false) + { + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer0, nativeGBuffer0); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer1, nativeGBuffer1); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer2, nativeGBuffer2); + cmd.SetGlobalTexture(HShaderParams.g_HTraceRenderLayerMask, renderLayerMask); + } + else + { + + if (HRendererURP.RenderGraphEnabled) + GBufferMRT = new RenderTargetIdentifier[] { ForwardGBuffer0.rt, ForwardGBuffer1.rt, ForwardGBuffer2.rt, ForwardGBuffer3.rt, ForwardGBufferDepth.rt, ForwardRenderLayerMask.rt }; + else + GBufferMRT = new RenderTargetIdentifier[] { ForwardGBuffer0.rt, ForwardGBuffer1.rt, ForwardGBuffer2.rt, ForwardGBuffer3.rt, ForwardRenderLayerMask.rt }; + + // If CameraDepthBuffer.rt doesn't work for any reason - we can replace it with our ForwardGBufferDepth.rt, but GBuffer rendering performance will suffer. + CoreUtils.SetRenderTarget(cmd, GBufferMRT, cameraDepthBuffer.rt); + + CullingResults cullingResults = renderingData.cullResults; + int layerMask = camera.cullingMask; + + ForwardGBufferRenderStateBlock.depthState = new DepthState(false, CompareFunction.LessEqual); + ForwardGBufferRenderStateBlock.mask |= RenderStateMask.Depth; + + var renderList = new UnityEngine.Rendering.RendererUtils.RendererListDesc(HShaderParams.UniversalGBufferTag, cullingResults, camera) + { + rendererConfiguration = PerObjectData.None, + renderQueueRange = RenderQueueRange.opaque, + sortingCriteria = SortingCriteria.OptimizeStateChanges, + layerMask = layerMask, + stateBlock = ForwardGBufferRenderStateBlock, + }; + + // Cache the current keyword state set by Unity + bool RenderLayerKeywordState = Shader.IsKeywordEnabled(HShaderParams._WRITE_RENDERING_LAYERS); + + // If we don't need render layers we do not touch the keyword at all +#if UNITY_2023_3_OR_NEWER + if (profile.GeneralSettings.ExcludeReceivingMask != 0 || profile.GeneralSettings.ExcludeCastingMask != 0) + CoreUtils.SetKeyword(cmd, HShaderParams._WRITE_RENDERING_LAYERS, true); +#endif + + CoreUtils.DrawRendererList(context, cmd, context.CreateRendererList(renderList)); + + // If we altered the keyword, we restore it to the original state +#if UNITY_2023_3_OR_NEWER + if (profile.GeneralSettings.ExcludeReceivingMask != 0 || profile.GeneralSettings.ExcludeCastingMask != 0) + CoreUtils.SetKeyword(cmd, HShaderParams._WRITE_RENDERING_LAYERS, RenderLayerKeywordState); +#endif + + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer0, ForwardGBuffer0.rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer1, ForwardGBuffer1.rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer2, ForwardGBuffer2.rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceRenderLayerMask, ForwardRenderLayerMask.rt); + } + } + } + #endregion --------------------------- Non Render Graph --------------------------- + + #region --------------------------- Render Graph --------------------------- + +#if UNITY_2023_3_OR_NEWER + private class PassData + { + public TextureHandle[] GBufferTextures; + public TextureHandle SSAOTexture; + public TextureHandle ColorTexture; + public TextureHandle DepthTexture; + public TextureHandle NormalsTexture; + public RendererListHandle ForwardGBufferRendererListHandle; + public UniversalCameraData UniversalCameraData; + + public TextureHandle ForwardGBuffer0Texture; + public TextureHandle ForwardGBuffer1Texture; + public TextureHandle ForwardGBuffer2Texture; + public TextureHandle ForwardGBuffer3Texture; + public TextureHandle ForwardRenderLayerMaskTexture; + public TextureHandle DepthPyramidTexture; + public TextureHandle DepthPyramidIntermediateTexture; + public TextureHandle ForwardGBufferDepthTexture; + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + using (var builder = renderGraph.AddUnsafePass(HNames.HTRACE_GBUFFER_PASS_NAME, out var passData, new ProfilingSampler(HNames.HTRACE_GBUFFER_PASS_NAME))) + { + UniversalResourceData resourceData = frameData.Get(); + UniversalCameraData universalCameraData = frameData.Get(); + UniversalRenderingData universalRenderingData = frameData.Get(); + UniversalLightData lightData = frameData.Get(); + + builder.AllowGlobalStateModification(true); + builder.AllowPassCulling(false); + + TextureHandle colorTexture = universalRenderingData.renderingMode == RenderingMode.Deferred ? resourceData.activeColorTexture : resourceData.cameraColor; + TextureHandle depthTexture = universalRenderingData.renderingMode == RenderingMode.Deferred ? resourceData.activeDepthTexture : resourceData.cameraDepth; + TextureHandle normalsTexture = resourceData.cameraNormalsTexture; + builder.UseTexture(depthTexture, AccessFlags.Read); + builder.UseTexture(normalsTexture, AccessFlags.Read); + + passData.NormalsTexture = resourceData.cameraNormalsTexture; + passData.ColorTexture = colorTexture; + passData.DepthTexture = depthTexture; + passData.UniversalCameraData = universalCameraData; + passData.GBufferTextures = resourceData.gBuffer; + passData.SSAOTexture = resourceData.ssaoTexture; + + if (HDepthPyramid == null) HDepthPyramid = HExtensions.LoadComputeShader("HDepthPyramid"); + + TextureHandle colorTextureHandle = resourceData.cameraColor; + TextureDesc desc = colorTextureHandle.GetDescriptor(renderGraph); + desc.clearBuffer = false; + TextureHandle depthTextureHandle = resourceData.cameraDepthTexture; + TextureDesc descDepth = depthTextureHandle.GetDescriptor(renderGraph); + descDepth.clearBuffer = false; + var graphicsFormatRenderingLayerMask = GraphicsFormat.R8G8B8A8_UNorm; + +#if UNITY_6000_2_OR_NEWER + graphicsFormatRenderingLayerMask = GraphicsFormat.R8G8_UInt; +#endif + passData.ForwardGBuffer0Texture = ExtensionsURP.CreateTexture(_ForwardGBuffer0, renderGraph, ref desc, format: GraphicsFormat.R8G8B8A8_SRGB); + builder.UseTexture(passData.ForwardGBuffer0Texture, AccessFlags.Write); + passData.ForwardGBuffer1Texture = ExtensionsURP.CreateTexture(_ForwardGBuffer1, renderGraph, ref desc, format: GraphicsFormat.R8G8B8A8_UNorm); + builder.UseTexture(passData.ForwardGBuffer1Texture, AccessFlags.Write); + passData.ForwardGBuffer2Texture = ExtensionsURP.CreateTexture(_ForwardGBuffer2, renderGraph, ref desc, format: GraphicsFormat.R8G8B8A8_SNorm); + builder.UseTexture(passData.ForwardGBuffer2Texture, AccessFlags.Write); + passData.ForwardGBuffer3Texture = ExtensionsURP.CreateTexture(_ForwardGBuffer3, renderGraph, ref desc, format: GraphicsFormat.B10G11R11_UFloatPack32); + builder.UseTexture(passData.ForwardGBuffer3Texture, AccessFlags.Write); + passData.ForwardRenderLayerMaskTexture = ExtensionsURP.CreateTexture(_ForwardRenderLayerMask, renderGraph, ref desc, format: graphicsFormatRenderingLayerMask); + builder.UseTexture(passData.ForwardRenderLayerMaskTexture, AccessFlags.Write); + passData.DepthPyramidTexture = ExtensionsURP.CreateTexture(_DepthPyramid, renderGraph, ref desc, format: GraphicsFormat.R16_SFloat, useMipMap: true); + builder.UseTexture(passData.DepthPyramidTexture, AccessFlags.Write); + + desc.width /= 16; + desc.height /= 16; + + passData.ForwardGBufferDepthTexture = ExtensionsURP.CreateTexture(_ForwardGBufferDepth, renderGraph, ref descDepth, format: GraphicsFormat.R16_SFloat, useMipMap: false, enableRandomWrite: false); + builder.UseTexture(passData.ForwardGBufferDepthTexture, AccessFlags.Write); + + if (universalRenderingData.renderingMode == RenderingMode.Deferred +#if UNITY_6000_1_OR_NEWER + || universalRenderingData.renderingMode == RenderingMode.DeferredPlus +#endif + ) + { + if (resourceData.ssaoTexture.IsValid()) + builder.UseTexture(resourceData.ssaoTexture, AccessFlags.Read); + builder.UseTexture(resourceData.gBuffer[0], AccessFlags.Read); + builder.UseTexture(resourceData.gBuffer[1], AccessFlags.Read); + builder.UseTexture(resourceData.gBuffer[2], AccessFlags.Read); + builder.UseTexture(resourceData.gBuffer[3], AccessFlags.Read); + if (resourceData.gBuffer.Length >= 6 && resourceData.gBuffer[5].IsValid()) + builder.UseTexture(resourceData.gBuffer[5], AccessFlags.Read); + } + + + CullingResults cullingResults = universalRenderingData.cullResults; + ShaderTagId tags = new ShaderTagId("UniversalGBuffer"); + int layerMask = universalCameraData.camera.cullingMask; + + ForwardGBufferRenderStateBlock.depthState = new DepthState(false, CompareFunction.LessEqual); + ForwardGBufferRenderStateBlock.mask |= RenderStateMask.Depth; + + RendererListDesc rendererListDesc = new RendererListDesc(tags, cullingResults, universalCameraData.camera) + { + rendererConfiguration = PerObjectData.None, + renderQueueRange = RenderQueueRange.opaque, + sortingCriteria = SortingCriteria.OptimizeStateChanges, + layerMask = layerMask, + stateBlock = ForwardGBufferRenderStateBlock, + }; + + passData.ForwardGBufferRendererListHandle = renderGraph.CreateRendererList(rendererListDesc); + builder.UseRendererList(passData.ForwardGBufferRendererListHandle); + + builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context)); + } + } + + private static void ExecutePass(PassData data, UnsafeGraphContext rgContext) + { + var cmd = CommandBufferHelpers.GetNativeCommandBuffer(rgContext.cmd); + + int width = (int)(data.UniversalCameraData.camera.scaledPixelWidth * data.UniversalCameraData.renderScale); + int height = (int)(data.UniversalCameraData.camera.scaledPixelHeight * data.UniversalCameraData.renderScale); + + // Set Depth, Color and SSAO to HTrace passes + cmd.SetGlobalTexture(HShaderParams.g_HTraceDepth, data.DepthTexture); + cmd.SetGlobalTexture(HShaderParams.g_HTraceColor, data.ColorTexture); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer2, data.NormalsTexture); + cmd.SetGlobalTexture(HShaderParams.g_HTraceSSAO, data.SSAOTexture.IsValid() ? data.SSAOTexture : Texture2D.whiteTexture); + + var nativeGBuffer0 = data.GBufferTextures[0]; + var nativeGBuffer1 = data.GBufferTextures[1]; + var nativeGBuffer2 = data.GBufferTextures[2]; + Texture renderLayerMaskTexture = data.GBufferTextures.Length >= 6 ? data.GBufferTextures[5] : null; + GBufferGenerationRenderGraph(cmd, data, width, height, nativeGBuffer0, nativeGBuffer1, nativeGBuffer2, renderLayerMaskTexture); + + GenerateDepthPyramidShared(cmd, width, height, data.DepthPyramidTexture); + } + + private static void GBufferGenerationRenderGraph(CommandBuffer cmd, PassData data, int width, int height, Texture nativeGBuffer0, Texture nativeGBuffer1, + Texture nativeGBuffer2, Texture renderLayerMask) + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + using (new ProfilingScope(cmd, GBufferProfilingSampler)) + { + // Sky probe management + SphericalHarmonicsL2 ambientProbe = RenderSettings.ambientProbe; + cmd.SetGlobalVector(HShaderParams.H_SHAr, new Vector4(ambientProbe[0, 3], ambientProbe[0, 1], ambientProbe[0, 2], ambientProbe[0, 0] - ambientProbe[0, 6])); + cmd.SetGlobalVector(HShaderParams.H_SHAg, new Vector4(ambientProbe[1, 3], ambientProbe[1, 1], ambientProbe[1, 2], ambientProbe[1, 0] - ambientProbe[1, 6])); + cmd.SetGlobalVector(HShaderParams.H_SHAb, new Vector4(ambientProbe[2, 3], ambientProbe[2, 1], ambientProbe[2, 2], ambientProbe[2, 0] - ambientProbe[2, 6])); + cmd.SetGlobalVector(HShaderParams.H_SHBr, new Vector4(ambientProbe[0, 4], ambientProbe[0, 5], ambientProbe[0, 6] * 3, ambientProbe[0, 7])); + cmd.SetGlobalVector(HShaderParams.H_SHBg, new Vector4(ambientProbe[1, 4], ambientProbe[1, 5], ambientProbe[1, 6] * 3, ambientProbe[1, 7])); + cmd.SetGlobalVector(HShaderParams.H_SHBb, new Vector4(ambientProbe[2, 4], ambientProbe[2, 5], ambientProbe[2, 6] * 3, ambientProbe[2, 7])); + cmd.SetGlobalVector(HShaderParams.H_SHC, new Vector4(ambientProbe[0, 8], ambientProbe[1, 8], ambientProbe[2, 8], 1)); + + // Check if GBuffer is valid (e.g. Forward / wrong scale / is not set, etc.) + bool requestForwardGBufferRender = false; + if (nativeGBuffer0 == null || nativeGBuffer1 == null || nativeGBuffer2 == null) + { requestForwardGBufferRender = true; } + else if ( nativeGBuffer0.width != width || nativeGBuffer0.height != height) // CameraDepthBuffer.rtHandleProperties.currentViewportSize.x + { requestForwardGBufferRender = true; } + + // Set Render Layer Mask to black dummy in case it's disabled as a feature and we can't render it + if (renderLayerMask == null) + renderLayerMask = Texture2D.blackTexture; // HRenderer.EmptyTexture; + + // RequestForwardGBufferRender = true; + + // Set GBuffer to HTrace passes if valid or render it otherwise + if (requestForwardGBufferRender == false) + { + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer0, nativeGBuffer0); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer1, nativeGBuffer1); + // cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer2, nativeGBuffer2); + cmd.SetGlobalTexture(HShaderParams.g_HTraceRenderLayerMask, renderLayerMask); + } + else + { + + if (HRendererURP.RenderGraphEnabled) + GBufferMRT = new RenderTargetIdentifier[] { data.ForwardGBuffer0Texture, data.ForwardGBuffer1Texture, data.ForwardGBuffer2Texture, data.ForwardGBuffer3Texture, data.ForwardGBufferDepthTexture, data.ForwardRenderLayerMaskTexture }; + else + GBufferMRT = new RenderTargetIdentifier[] { data.ForwardGBuffer0Texture, data.ForwardGBuffer1Texture, data.ForwardGBuffer2Texture, data.ForwardGBuffer3Texture, data.ForwardRenderLayerMaskTexture }; + + // If CameraDepthBuffer.rt doesn't work for any reason - we can replace it with our ForwardGBufferDepth.rt, but GBuffer rendering performance will suffer. + CoreUtils.SetRenderTarget(cmd, GBufferMRT, data.DepthTexture, ClearFlag.None); + + // Cache the current keyword state set by Unity + bool RenderLayerKeywordState = Shader.IsKeywordEnabled(HShaderParams._WRITE_RENDERING_LAYERS); + + // If we don't need render layers we do not touch the keyword at all +#if UNITY_2023_3_OR_NEWER + if (profile.GeneralSettings.ExcludeReceivingMask != 0 || profile.GeneralSettings.ExcludeCastingMask != 0) + CoreUtils.SetKeyword(cmd, HShaderParams._WRITE_RENDERING_LAYERS, true); +#endif + + cmd.DrawRendererList(data.ForwardGBufferRendererListHandle); + + // If we altered the keyword, we restore it to the original state +#if UNITY_2023_3_OR_NEWER + if (profile.GeneralSettings.ExcludeReceivingMask != 0 || profile.GeneralSettings.ExcludeCastingMask != 0) + CoreUtils.SetKeyword(cmd, HShaderParams._WRITE_RENDERING_LAYERS, RenderLayerKeywordState); +#endif + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer0, data.ForwardGBuffer0Texture); + cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer1, data.ForwardGBuffer1Texture); + // cmd.SetGlobalTexture(HShaderParams.g_HTraceGBuffer2, data.ForwardGBuffer2Texture); + cmd.SetGlobalTexture(HShaderParams.g_HTraceRenderLayerMask, data.ForwardRenderLayerMaskTexture); + } + } + } +#endif + #endregion --------------------------- Render Graph --------------------------- + + #region --------------------------- Shared --------------------------- + + private static void GenerateDepthPyramidShared(CommandBuffer cmd, int width, int height, RTHandle depthPyramidTexture) + { + using (new ProfilingScope(cmd, DepthPyramidGenerationProfilingSampler)) + { + int generate_depth_pyramid_kernel = HDepthPyramid.FindKernel("GenerateDepthPyramid"); + cmd.SetComputeTextureParam(HDepthPyramid, generate_depth_pyramid_kernel, HShaderParams._DepthPyramid_OutputMIP0, depthPyramidTexture, 0); + cmd.SetComputeTextureParam(HDepthPyramid, generate_depth_pyramid_kernel, HShaderParams._DepthPyramid_OutputMIP1, depthPyramidTexture, 1); + cmd.SetComputeTextureParam(HDepthPyramid, generate_depth_pyramid_kernel, HShaderParams._DepthPyramid_OutputMIP2, depthPyramidTexture, 2); + cmd.SetComputeTextureParam(HDepthPyramid, generate_depth_pyramid_kernel, HShaderParams._DepthPyramid_OutputMIP3, depthPyramidTexture, 3); + cmd.SetComputeTextureParam(HDepthPyramid, generate_depth_pyramid_kernel, HShaderParams._DepthPyramid_OutputMIP4, depthPyramidTexture, 4); + cmd.DispatchCompute(HDepthPyramid, generate_depth_pyramid_kernel, Mathf.CeilToInt(width / 16.0f), Mathf.CeilToInt(height / 16.0f), HRenderer.TextureXrSlices); + + cmd.SetGlobalTexture(HShaderParams.g_HTraceDepthPyramidSSGI, depthPyramidTexture); + } + } + + + protected internal void Dispose() + { + Dummy?.HRelease(); + ForwardGBuffer0?.HRelease(); + ForwardGBuffer1?.HRelease(); + ForwardGBuffer2?.HRelease(); + ForwardGBuffer3?.HRelease(); + ForwardRenderLayerMask?.HRelease(); + ForwardGBufferDepth?.HRelease(); + DepthPyramidRT?.HRelease(); + } + + #endregion --------------------------- Shared --------------------------- + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs.meta new file mode 100644 index 0000000..515e643 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: fd63347b53844f7fa3fdc1ef13ff65ba +timeCreated: 1757347187 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/URP/GBufferPassURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs new file mode 100644 index 0000000..2c18b01 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs @@ -0,0 +1,345 @@ +//pipelinedefine +#define H_URP + +using System; +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Wrappers; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; +#if UNITY_2023_3_OR_NEWER +using UnityEngine.Rendering.RenderGraphModule; +#else +using UnityEngine.Experimental.Rendering.RenderGraphModule; +#endif + + +namespace HTraceSSGI.Scripts.Passes.URP +{ + internal class MotionVectorsURP : ScriptableRenderPass + { + // Texture Names + const string _ObjectMotionVectorsColorURP = "_ObjectMotionVectorsColorURP"; + const string _ObjectMotionVectorsDepthURP = "_ObjectMotionVectorsDepthURP"; + const string _CustomCameraMotionVectorsURP_0 = "_CustomCameraMotionVectorsURP_0"; + const string _CustomCameraMotionVectorsURP_1 = "_CustomCameraMotionVectorsURP_1"; + const string _MotionVectorsTagID = "MotionVectors"; + + // Shader Properties + private static readonly int _ObjectMotionVectorsColor = Shader.PropertyToID("_ObjectMotionVectors"); + private static readonly int _ObjectMotionVectorsDepth = Shader.PropertyToID("_ObjectMotionVectorsDepth"); + private static readonly int _BiasOffset = Shader.PropertyToID("_BiasOffset"); + + // Textures + internal static RTWrapper[] CustomCameraMotionVectorsURP = new RTWrapper[2] {new RTWrapper(), new RTWrapper()}; + internal static RTWrapper ObjectMotionVectorsColorURP = new RTWrapper(); + internal static RTWrapper ObjectMotionVectorsDepthURP = new RTWrapper(); + + // Materials + private static Material MotionVectorsMaterial_URP; + + private static ProfilingSampler ObjectMVProfilingSampler = new ProfilingSampler(HNames.HTRACE_OBJECTS_MV_PASS_NAME); + private static ProfilingSampler MVProfilingSampler = new ProfilingSampler(HNames.HTRACE_CAMERA_MV_PASS_NAME); + + + #region --------------------------- Non Render Graph --------------------------- + + private ScriptableRenderer _renderer; + private static int _historyCameraIndex; + + protected internal void Initialize(ScriptableRenderer renderer) + { + _renderer = renderer; + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + Setup(renderingData.cameraData.camera, renderingData.cameraData.renderScale, renderingData.cameraData.cameraTargetDescriptor); + } + + private static void Setup(Camera camera, float renderScale, RenderTextureDescriptor desc) + { + if (MotionVectorsMaterial_URP == null) MotionVectorsMaterial_URP = new Material(Shader.Find($"Hidden/{HNames.ASSET_NAME}/MotionVectorsURP")); + + int width = (int)(camera.scaledPixelWidth * renderScale); + int height = (int)(camera.scaledPixelHeight * renderScale); + + if (desc.width != width || desc.height != height) + desc = new RenderTextureDescriptor(width, height); + + desc.depthBufferBits = 0; // Color and depth cannot be combined in RTHandles + desc.stencilFormat = GraphicsFormat.None; + desc.depthStencilFormat = GraphicsFormat.None; + desc.msaaSamples = 1; + desc.bindMS = false; + desc.enableRandomWrite = true; + + RenderTextureDescriptor depthDesc = desc; + depthDesc.depthBufferBits = 32; + depthDesc.enableRandomWrite = false; + depthDesc.colorFormat = RenderTextureFormat.Depth; + + CustomCameraMotionVectorsURP[0].ReAllocateIfNeeded(_CustomCameraMotionVectorsURP_0, ref desc, graphicsFormat: GraphicsFormat.R16G16_SFloat); + CustomCameraMotionVectorsURP[1].ReAllocateIfNeeded(_CustomCameraMotionVectorsURP_1, ref desc, graphicsFormat: GraphicsFormat.R8_SNorm); + ObjectMotionVectorsColorURP.ReAllocateIfNeeded(_ObjectMotionVectorsColorURP, ref desc, graphicsFormat: GraphicsFormat.R16G16_SFloat); + ObjectMotionVectorsDepthURP.ReAllocateIfNeeded(_ObjectMotionVectorsDepthURP, ref depthDesc, enableRandomWrite: false); + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) + { + ConfigureInput(ScriptableRenderPassInput.Motion | ScriptableRenderPassInput.Depth); + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + var cmd = CommandBufferPool.Get(HNames.HTRACE_MV_PASS_NAME); + + Camera camera = renderingData.cameraData.camera; + + + RenderMotionVectorsNonRenderGraph(cmd, camera, ref renderingData, ref context); + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + } + + private void RenderMotionVectorsNonRenderGraph(CommandBuffer cmd, Camera camera, ref RenderingData renderingData, ref ScriptableRenderContext context) + { + void RenderObjectsMotionVectors(ref RenderingData renderingData, ref ScriptableRenderContext context) + { +#if UNITY_2023_3_OR_NEWER + if (camera.cameraType == CameraType.SceneView) + return; +#endif + + CoreUtils.SetRenderTarget(cmd, ObjectMotionVectorsColorURP.rt, ClearFlag.All, Color.clear); + CoreUtils.SetRenderTarget(cmd, ObjectMotionVectorsDepthURP.rt, ClearFlag.All, Color.clear); +#if UNITY_2023_1_OR_NEWER + // We'll write not only to our own Color, but also to our own Depth target to use it later (in Camera MV) to compose per-object mv + CoreUtils.SetRenderTarget(cmd, ObjectMotionVectorsColorURP.rt, ObjectMotionVectorsDepthURP.rt); +#else + // Prior to 2023 camera motion vectors are rendered directly on objects, so we write to both motion mask and motion vectors via MRT + RenderTargetIdentifier[] motionVectorsMRT = { CustomCameraMotionVectorsURP[0].rt, CustomCameraMotionVectorsURP[1].rt,}; + CoreUtils.SetRenderTarget(cmd, motionVectorsMRT, ObjectMotionVectorsDepthURP.rt); + +#endif // UNITY_2023_1_OR_NEWER + + CullingResults cullingResults = renderingData.cullResults; + + ShaderTagId[] tags +#if UNITY_2023_1_OR_NEWER + = {new ShaderTagId("MotionVectors")}; +#else + = {new ShaderTagId("Meta")}; +#endif // UNITY_2023_1_OR_NEWER + + var renderList = new UnityEngine.Rendering.RendererUtils.RendererListDesc(tags, cullingResults, camera) + { + rendererConfiguration = PerObjectData.MotionVectors, + renderQueueRange = RenderQueueRange.opaque, + sortingCriteria = SortingCriteria.CommonOpaque, + layerMask = camera.cullingMask, + overrideMaterial +#if UNITY_2023_1_OR_NEWER + = null, +#else + = MotionVectorsMaterial_URP, + overrideMaterialPassIndex = 1, + // If somethingis wrong with our custom shader we can always use the standard one (and ShaderPass = 0) instead + // Material ObjectMotionVectorsMaterial = new Material(Shader.Find("Hidden/Universal Render Pipeline/ObjectMotionVectors")); + // overrideMaterialPassIndex = 0, +#endif //UNITY_2023_1_OR_NEWER + + }; + + CoreUtils.DrawRendererList(context, cmd, context.CreateRendererList(renderList)); + +#if !UNITY_2023_1_OR_NEWER + // Prior to 2023 camera motion vectors are rendered directly on objects, so we will finish mv calculation here and won't execute camera mv + cmd.SetGlobalTexture(HShaderParams.g_HTraceMotionVectors, CustomCameraMotionVectorsURP[0].rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceMotionMask, CustomCameraMotionVectorsURP[1].rt); +#endif // UNITY_2023_1_OR_NEWER + } + + + void RenderCameraMotionVectors() + { +#if UNITY_2023_1_OR_NEWER + + float DepthBiasOffset = 0; +#if UNITY_2023_1_OR_NEWER + DepthBiasOffset = 0.00099f; +#endif // UNITY_2023_1_OR_NEWER +#if UNITY_6000_0_OR_NEWER + DepthBiasOffset = 0; +#endif // UNITY_6000_0_OR_NEWER + + // Target target[0] is set as a Depth Buffer, just because this method requires Depth, but we don't care for it in the fullscreen pass + RenderTargetIdentifier[] motionVectorsMRT = { CustomCameraMotionVectorsURP[0].rt, CustomCameraMotionVectorsURP[1].rt}; + CoreUtils.SetRenderTarget(cmd, motionVectorsMRT, motionVectorsMRT[0]); + + MotionVectorsMaterial_URP.SetTexture(_ObjectMotionVectorsColor, ObjectMotionVectorsColorURP.rt); + MotionVectorsMaterial_URP.SetTexture(_ObjectMotionVectorsDepth, ObjectMotionVectorsDepthURP.rt); + MotionVectorsMaterial_URP.SetFloat(_BiasOffset, DepthBiasOffset); + + cmd.DrawProcedural(Matrix4x4.identity, MotionVectorsMaterial_URP, 0, MeshTopology.Triangles, 3, 1); + + // This restores color camera color target (.SetRenderTarget can be used for Forward + any Depth Priming, but doesn't work in Deferred) +#pragma warning disable CS0618 + ConfigureTarget(_renderer.cameraColorTargetHandle); +#pragma warning restore CS0618 + + cmd.SetGlobalTexture(HShaderParams.g_HTraceMotionVectors, CustomCameraMotionVectorsURP[0].rt); + cmd.SetGlobalTexture(HShaderParams.g_HTraceMotionMask, CustomCameraMotionVectorsURP[1].rt); +#endif // UNITY_2023_1_OR_NEWER + } + + RenderObjectsMotionVectors(ref renderingData, ref context); + RenderCameraMotionVectors(); + } + + #endregion --------------------------- Non Render Graph --------------------------- + + #region --------------------------- Render Graph --------------------------- + +#if UNITY_2023_3_OR_NEWER + private class ObjectMVPassData + { + public RendererListHandle RendererListHandle; + } + + private class CameraMVPassData + { + public TextureHandle ObjectMotionVectorsColor; + public TextureHandle ObjectMotionVectorsDepth; + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + UniversalCameraData universalCameraData = frameData.Get(); + + ConfigureInput(ScriptableRenderPassInput.Motion | ScriptableRenderPassInput.Depth); + + using (IRasterRenderGraphBuilder builder = renderGraph.AddRasterRenderPass(HNames.HTRACE_OBJECTS_MV_PASS_NAME, out var passData, ObjectMVProfilingSampler)) + { + UniversalResourceData resourceData = frameData.Get(); + UniversalRenderingData universalRenderingData = frameData.Get(); + + builder.AllowGlobalStateModification(true); + builder.AllowPassCulling(false); + + TextureHandle depthTexture = resourceData.activeDepthTexture; + TextureHandle motionVectorsTexture = resourceData.motionVectorColor; + if (motionVectorsTexture.IsValid()) + builder.UseTexture(motionVectorsTexture, AccessFlags.Read); + + AddRendererList(renderGraph, universalCameraData, universalRenderingData, passData, builder); + + // This was previously colorTexture.GetDescriptor(renderGraph); + TextureDesc descDepth = depthTexture.GetDescriptor(renderGraph); + descDepth.colorFormat = GraphicsFormat.R16G16_SFloat; + descDepth.name = _ObjectMotionVectorsColorURP; + TextureHandle objectMotionVectorsColorTexHandle = renderGraph.CreateTexture(descDepth); + + builder.SetRenderAttachment(objectMotionVectorsColorTexHandle, 0); + builder.SetRenderAttachmentDepth(depthTexture, AccessFlags.ReadWrite); + + //if (motionVectorsTexture.IsValid()) //seems to work fine without this + builder.SetGlobalTextureAfterPass(motionVectorsTexture, HShaderParams.g_HTraceMotionVectors); + builder.SetGlobalTextureAfterPass(objectMotionVectorsColorTexHandle, HShaderParams.g_HTraceMotionMask); + + builder.SetRenderFunc((ObjectMVPassData data, RasterGraphContext context) => + { + RasterCommandBuffer cmd = context.cmd; + + cmd.ClearRenderTarget(false, true, Color.black); + cmd.DrawRendererList(data.RendererListHandle); + }); + } + + // Render Graph + Game View - no need to render camera mv, as they are already available to us in this combination + if (universalCameraData.cameraType == CameraType.Game) + return; + + using (IRasterRenderGraphBuilder builder = renderGraph.AddRasterRenderPass(HNames.HTRACE_CAMERA_MV_PASS_NAME, out var passData, MVProfilingSampler)) + { + UniversalResourceData resourceData = frameData.Get(); + + builder.AllowGlobalStateModification(true); + builder.AllowPassCulling(false); + + TextureHandle colorTexture = resourceData.activeColorTexture; + + if (MotionVectorsMaterial_URP == null) MotionVectorsMaterial_URP = new Material(Shader.Find($"Hidden/{HNames.ASSET_NAME}/MotionVectorsURP")); + + TextureDesc desc = colorTexture.GetDescriptor(renderGraph); + desc.colorFormat = GraphicsFormat.R16G16_SFloat; + desc.name = _CustomCameraMotionVectorsURP_0; + TextureHandle cameraMotionVectorsColorTexHandle = renderGraph.CreateTexture(desc); + + builder.SetRenderAttachment(cameraMotionVectorsColorTexHandle, 0); + builder.SetGlobalTextureAfterPass(cameraMotionVectorsColorTexHandle, HShaderParams.g_HTraceMotionVectors); + + builder.SetRenderFunc((CameraMVPassData data, RasterGraphContext context) => + { + RasterCommandBuffer cmd = context.cmd; + + MotionVectorsMaterial_URP.SetTexture(_ObjectMotionVectorsColor, context.defaultResources.blackTexture); + MotionVectorsMaterial_URP.SetTexture(_ObjectMotionVectorsDepth, context.defaultResources.whiteTexture); + MotionVectorsMaterial_URP.SetFloat(_BiasOffset, 0); + + cmd.DrawProcedural(Matrix4x4.identity, MotionVectorsMaterial_URP, 0, MeshTopology.Triangles, 3, 1); + }); + } + } + + private static void AddRendererList(RenderGraph renderGraph, UniversalCameraData universalCameraData, UniversalRenderingData universalRenderingData, ObjectMVPassData objectMvPassData, IRasterRenderGraphBuilder builder) + { + RenderStateBlock ForwardGBufferRenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); + ForwardGBufferRenderStateBlock.depthState = new DepthState(false, CompareFunction.LessEqual); // Probably CompareFunction.Less ? + ForwardGBufferRenderStateBlock.mask |= RenderStateMask.Depth; + + ShaderTagId motionVectorsShaderTag = new ShaderTagId(_MotionVectorsTagID); + + var renderList = new UnityEngine.Rendering.RendererUtils.RendererListDesc(motionVectorsShaderTag, universalRenderingData.cullResults, universalCameraData.camera) + { + rendererConfiguration = PerObjectData.MotionVectors, + renderQueueRange = RenderQueueRange.opaque, + sortingCriteria = SortingCriteria.CommonOpaque, + stateBlock = ForwardGBufferRenderStateBlock, + }; + + objectMvPassData.RendererListHandle = renderGraph.CreateRendererList(renderList); + + builder.UseRendererList(objectMvPassData.RendererListHandle); + } +#endif + + #endregion --------------------------- Render Graph --------------------------- + + #region --------------------------- Share --------------------------- + + protected internal void Dispose() + { + CustomCameraMotionVectorsURP[0]?.HRelease(); + CustomCameraMotionVectorsURP[1]?.HRelease(); + ObjectMotionVectorsColorURP?.HRelease(); + ObjectMotionVectorsDepthURP?.HRelease(); + } + + #endregion --------------------------- Share --------------------------- + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs.meta new file mode 100644 index 0000000..ffc6f90 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 603fb045f7d843da93b9e3f0435072b7 +timeCreated: 1757339660 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/URP/MotionVectorsURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs new file mode 100644 index 0000000..8b12e69 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs @@ -0,0 +1,225 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Extensions.CameraHistorySystem; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Passes.Shared; +using HTraceSSGI.Scripts.Wrappers; +using Unity.Collections; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.RendererUtils; +using UnityEngine.Rendering.Universal; + +#if UNITY_2023_3_OR_NEWER +using UnityEngine.Rendering.RenderGraphModule; +#else +using UnityEngine.Experimental.Rendering.RenderGraphModule; +#endif + +namespace HTraceSSGI.Scripts.Passes.URP +{ + internal class PrePassURP : ScriptableRenderPass + { + private static Vector4 s_HRenderScalePrevious = Vector4.one; + + private struct HistoryCameraData : ICameraHistoryData + { + private int hash; + public Matrix4x4 previousViewProjMatrix; + public Matrix4x4 previousInvViewProjMatrix; + + public int GetHash() => hash; + public void SetHash(int hashIn) => this.hash = hashIn; + } + + private static readonly CameraHistorySystem CameraHistorySystem = new CameraHistorySystem(); + private static int s_FrameCount = 0; + + #region --------------------------- Non Render Graph --------------------------- + private ScriptableRenderer _renderer; + + protected internal void Initialize(ScriptableRenderer renderer) + { + _renderer = renderer; + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + Camera camera = renderingData.cameraData.camera; + + CameraHistorySystem.UpdateCameraHistoryIndex(camera.GetHashCode()); + CameraHistorySystem.UpdateCameraHistoryData(); + CameraHistorySystem.GetCameraData().SetHash(camera.GetHashCode()); + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) + { + ConfigureInput(ScriptableRenderPassInput.Depth); // | ScriptableRenderPassInput.Normal); + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + var cmd = CommandBufferPool.Get(HNames.HTRACE_PRE_PASS_NAME); + + Camera camera = renderingData.cameraData.camera; + + // -------------- HRenderScale ----------------- + // Unity's _RTHandleScale in URP always (1,1,1,1)? We need to overwrite it anyway... + cmd.SetGlobalVector(HShaderParams.HRenderScalePrevious, s_HRenderScalePrevious); + //s_HRenderScalePrevious = new Vector4(RTHandles.rtHandleProperties.rtHandleScale.x, RTHandles.rtHandleProperties.rtHandleScale.y, 1 / RTHandles.rtHandleProperties.rtHandleScale.x, 1 / RTHandles.rtHandleProperties.rtHandleScale.y); //we don't needed it more + cmd.SetGlobalVector(HShaderParams.HRenderScale, s_HRenderScalePrevious); + + // -------------- Matrix ----------------- + Matrix4x4 projMatrix = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); //renderingData.cameraData.GetGPUProjectionMatrix(); + Matrix4x4 viewMatrix = renderingData.cameraData.GetViewMatrix(); + Matrix4x4 viewProjMatrix = projMatrix * viewMatrix; + Matrix4x4 invViewProjMatrix = Matrix4x4.Inverse(viewProjMatrix); + { + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_VP, viewProjMatrix); + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_I_VP, invViewProjMatrix); + ref var previousViewProjMatrix = ref CameraHistorySystem.GetCameraData().previousViewProjMatrix; + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_PREV_VP, previousViewProjMatrix); + ref var previousInvViewProjMatrix = ref CameraHistorySystem.GetCameraData().previousInvViewProjMatrix; + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_PREV_I_VP, previousInvViewProjMatrix); + + previousViewProjMatrix = viewProjMatrix; + previousInvViewProjMatrix = invViewProjMatrix; + CameraHistorySystem.GetCameraData().SetHash(camera.GetHashCode()); + + // HistoryCameraData currentData = CameraHistorySystem.GetCameraData(); + // currentData.previousViewProjMatrix = viewProjMatrix; + // currentData.previousInvViewProjMatrix = invViewProjMatrix; + // CameraHistorySystem.SetCameraData(currentData); + } + + + // -------------- Other ----------------- + cmd.SetGlobalInt(HShaderParams.FrameCount, s_FrameCount); + s_FrameCount++; + // Unity's blue noise is unreliable, so we'll use ours in all pipelines + HBlueNoise.SetTextures(cmd); + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + } + #endregion --------------------------- Non Render Graph --------------------------- + + #region --------------------------- Render Graph --------------------------- + +#if UNITY_2023_3_OR_NEWER + RTHandle OwenScrambledRTHandle; + RTHandle ScramblingTileXSPPRTHandle; + RTHandle RankingTileXSPPRTHandle; + RTHandle ScramblingTextureRTHandle; + + private class PassData + { + public RendererListHandle RendererListHandle; + public UniversalCameraData UniversalCameraData; + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + using (var builder = renderGraph.AddRasterRenderPass(HNames.HTRACE_PRE_PASS_NAME, out var passData, new ProfilingSampler(HNames.HTRACE_PRE_PASS_NAME))) + { + UniversalResourceData resourceData = frameData.Get(); + UniversalCameraData universalCameraData = frameData.Get(); + UniversalRenderingData universalRenderingData = frameData.Get(); + UniversalLightData lightData = frameData.Get(); + + ConfigureInput(ScriptableRenderPassInput.Depth | ScriptableRenderPassInput.Normal); + + builder.AllowGlobalStateModification(true); + builder.AllowPassCulling(false); + + passData.UniversalCameraData = universalCameraData; + + Camera camera = universalCameraData.camera; + + CameraHistorySystem.UpdateCameraHistoryIndex(camera.GetHashCode()); + CameraHistorySystem.UpdateCameraHistoryData(); + CameraHistorySystem.GetCameraData().SetHash(camera.GetHashCode()); + + //Blue noise + if (OwenScrambledRTHandle == null) OwenScrambledRTHandle = RTHandles.Alloc(HBlueNoise.OwenScrambledTexture); + TextureHandle owenScrambledTextureHandle = renderGraph.ImportTexture(OwenScrambledRTHandle); + builder.SetGlobalTextureAfterPass(owenScrambledTextureHandle, HBlueNoise.g_OwenScrambledTexture); + + if (ScramblingTileXSPPRTHandle == null) ScramblingTileXSPPRTHandle = RTHandles.Alloc(HBlueNoise.ScramblingTileXSPP); + TextureHandle scramblingTileXSPPTextureHandle = renderGraph.ImportTexture(ScramblingTileXSPPRTHandle); + builder.SetGlobalTextureAfterPass(scramblingTileXSPPTextureHandle, HBlueNoise.g_ScramblingTileXSPP); + + if (RankingTileXSPPRTHandle == null) RankingTileXSPPRTHandle = RTHandles.Alloc(HBlueNoise.RankingTileXSPP); + TextureHandle rankingTileXSPPTextureHandle = renderGraph.ImportTexture(RankingTileXSPPRTHandle); + builder.SetGlobalTextureAfterPass(rankingTileXSPPTextureHandle, HBlueNoise.g_RankingTileXSPP); + + if (ScramblingTextureRTHandle == null) ScramblingTextureRTHandle = RTHandles.Alloc(HBlueNoise.ScramblingTexture); + TextureHandle scramblingTextureHandle = renderGraph.ImportTexture(ScramblingTextureRTHandle); + builder.SetGlobalTextureAfterPass(scramblingTextureHandle, HBlueNoise.g_ScramblingTexture); + + builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context)); + } + } + + private static void ExecutePass(PassData data, RasterGraphContext rgContext) + { + var cmd = rgContext.cmd; + + Camera camera = data.UniversalCameraData.camera; + + // -------------- HRenderScale ----------------- + // Unity's _RTHandleScale in URP always (1,1,1,1)? We need to overwrite it anyway... + cmd.SetGlobalVector(HShaderParams.HRenderScalePrevious, s_HRenderScalePrevious); + //s_HRenderScalePrevious = new Vector4(RTHandles.rtHandleProperties.rtHandleScale.x, RTHandles.rtHandleProperties.rtHandleScale.y, 1 / RTHandles.rtHandleProperties.rtHandleScale.x, 1 / RTHandles.rtHandleProperties.rtHandleScale.y); //we don't needed it more + cmd.SetGlobalVector(HShaderParams.HRenderScale, s_HRenderScalePrevious); + + // -------------- Matrix ----------------- + + Matrix4x4 projMatrix = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); //renderingData.cameraData.GetGPUProjectionMatrix(); + Matrix4x4 viewMatrix = data.UniversalCameraData.GetViewMatrix(); + Matrix4x4 viewProjMatrix = projMatrix * viewMatrix; + Matrix4x4 invViewProjMatrix = Matrix4x4.Inverse(viewProjMatrix); + { + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_VP, viewProjMatrix); + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_I_VP, invViewProjMatrix); + ref var previousViewProjMatrix = ref CameraHistorySystem.GetCameraData().previousViewProjMatrix; + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_PREV_VP, previousViewProjMatrix); + ref var previousInvViewProjMatrix = ref CameraHistorySystem.GetCameraData().previousInvViewProjMatrix; + cmd.SetGlobalMatrix(HShaderParams.H_MATRIX_PREV_I_VP, previousInvViewProjMatrix); + + previousViewProjMatrix = viewProjMatrix; + previousInvViewProjMatrix = invViewProjMatrix; + CameraHistorySystem.GetCameraData().SetHash(camera.GetHashCode()); + + // HistoryCameraData currentData = CameraHistorySystem.GetCameraData(); + // currentData.previousViewProjMatrix = viewProjMatrix; + // currentData.previousInvViewProjMatrix = invViewProjMatrix; + // CameraHistorySystem.SetCameraData(currentData); + } + + // -------------- Other ----------------- + cmd.SetGlobalInt(HShaderParams.FrameCount, s_FrameCount); + s_FrameCount++; + } +#endif + + #endregion --------------------------- Render Graph --------------------------- + + protected internal void Dispose() + { + s_FrameCount = 0; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs.meta new file mode 100644 index 0000000..36a4a06 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1499f9a9fbb1cf242835eeae03872d5d +timeCreated: 1729952288 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/URP/PrePassURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs new file mode 100644 index 0000000..e594de2 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs @@ -0,0 +1,446 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Data.Private; +using HTraceSSGI.Scripts.Data.Public; +using HTraceSSGI.Scripts.Extensions; +using HTraceSSGI.Scripts.Globals; +using HTraceSSGI.Scripts.Passes.Shared; +using HTraceSSGI.Scripts.Wrappers; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +#if UNITY_2023_3_OR_NEWER +using HTraceSSGI.Scripts.Infrastructure.URP; +using UnityEngine.Rendering.RenderGraphModule; +#endif + +namespace HTraceSSGI.Scripts.Passes.URP +{ + internal class SSGIPassURP : ScriptableRenderPass + { + private static readonly int CameraNormalsTexture = Shader.PropertyToID("_CameraNormalsTexture"); + + // Texture Names + internal const string _ColorPreviousFrame = "_ColorPreviousFrame"; + internal const string _DebugOutput = "_DebugOutput"; + internal const string _ColorCopy = "_ColorCopy"; + internal const string _ReservoirLuminance = "_ReservoirLuminance"; + internal const string _Reservoir = "_Reservoir"; + internal const string _ReservoirReprojected = "_ReservoirReprojected"; + internal const string _ReservoirSpatial = "_ReservoirSpatial"; + internal const string _ReservoirTemporal = "_ReservoirTemporal"; + internal const string _SampleCount = "_Samplecount"; + internal const string _SamplecountReprojected = "_SamplecountReprojected"; + internal const string _TemporalInvalidityFilteredA = "_TemporalInvalidityFilteredA"; + internal const string _TemporalInvalidityFilteredB = "_TemporalInvalidityFilteredB"; + internal const string _TemporalInvalidityAccumulated = "_TemporalInvalidityAccumulated"; + internal const string _TemporalInvalidityReprojected = "_TemporalInvalidityReprojected"; + internal const string _SpatialOcclusionAccumulated = "_SpatialOcclusionAccumulated"; + internal const string _SpatialOcclusionReprojected = "_SpatialOcclusionReprojected"; + internal const string _AmbientOcclusion = "_AmbientOcclusion"; + internal const string _AmbientOcclusionGuidance = "_AmbientOcclusionGuidance"; + internal const string _AmbientOcclusionInvalidity = "_AmbientOcclusionInvalidity"; + internal const string _AmbientOcclusionAccumulated = "_AmbientOcclusionAccumulated"; + internal const string _AmbientOcclusionReprojected = "_AmbientOcclusionReprojected"; + internal const string _Radiance = "_Radiance"; + internal const string _RadianceReprojected = "_RadianceReprojected"; + internal const string _RadianceAccumulated = "_RadianceAccumulated"; + internal const string _RadianceFiltered = "_RadianceFiltered"; + internal const string _RadianceInterpolated = "_RadianceInterpolated"; + internal const string _RadianceStabilized = "_RadianceStabilized"; + internal const string _RadianceStabilizedReprojected = "_RadianceStabilizedReprojected"; + internal const string _RadianceNormalDepth = "_RadianceNormalDepth"; + internal const string _ColorReprojected = "_ColorReprojected"; + internal const string _NormalDepthHistory = "_NormalDepthHistory"; + internal const string _NormalDepthHistoryFullRes = "_NormalDepthHistoryFullRes"; + internal const string _DummyBlackTexture = "_DummyBlackTexture"; + + #region --------------------------- Non Render Graph --------------------------- + + private ScriptableRenderer _renderer; + + protected internal void Initialize(ScriptableRenderer renderer) + { + _renderer = renderer; + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + SSGI.CameraHistorySystem.UpdateCameraHistoryIndex(renderingData.cameraData.camera.GetHashCode()); + SSGI.CameraHistorySystem.UpdateCameraHistoryData(); + SSGI.CameraHistorySystem.GetCameraData().SetHash(renderingData.cameraData.camera.GetHashCode()); + + SetupShared(renderingData.cameraData.camera, renderingData.cameraData.renderScale, renderingData.cameraData.cameraTargetDescriptor); + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) + { + } + +#if UNITY_2023_3_OR_NEWER + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + var cmd = CommandBufferPool.Get(HNames.HTRACE_SSGI_PASS_NAME); + + Camera camera = renderingData.cameraData.camera; + float renderScale = renderingData.cameraData.renderScale; + int width = (int)(camera.scaledPixelWidth * renderScale); + int height = (int)(camera.scaledPixelHeight * renderScale); + + if (Shader.GetGlobalTexture(CameraNormalsTexture) == null) + return; + + // ---------------------------------------- AMBIENT LIGHTING OVERRIDE ---------------------------------------- // + using (new ProfilingScope(cmd, SSGI.AmbientLightingOverrideSampler)) + { + cmd.SetGlobalFloat(SSGI._IndirectLightingIntensity, profile.SSGISettings.Intensity); + + if (profile.GeneralSettings.AmbientOverride) + { + // Copy Color buffer + CoreUtils.SetRenderTarget(cmd, SSGI.ColorCopy_URP.rt); + cmd.DrawProcedural(Matrix4x4.identity, SSGI.ColorCompose_URP, 0, MeshTopology.Triangles, 3, 1); + + // Subtract indirect lighting from Color buffer + CoreUtils.SetRenderTarget(cmd, _renderer.cameraColorTargetHandle); + SSGI.ColorCompose_URP.SetTexture(SSGI._ColorCopy, SSGI.ColorCopy_URP.rt); + cmd.DrawProcedural(Matrix4x4.identity, SSGI.ColorCompose_URP, 1, MeshTopology.Triangles, 3, 1); + } + + // Early out if we want to prview direct lighting only + if (profile.GeneralSettings.DebugMode == DebugMode.DirectLighting) + { + ConfigureTarget(_renderer.cameraColorTargetHandle); + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + + return; + } + } + + SSGI.Execute(cmd, camera, width, height, _renderer.cameraColorTargetHandle); + + // ---------------------------------------- INDIRECT LIGHTING INJECTION ---------------------------------------- // + using (new ProfilingScope(cmd, SSGI.IndirectLightingInjectionSampler)) + { + var finalOutput = Mathf.Approximately(profile.SSGISettings.RenderScale, 1.0f) ? SSGI.RadianceFiltered.rt : SSGI.RadianceInterpolated.rt; + cmd.SetGlobalTexture(SSGI._SampleCountSSGI, SSGI.SamplecountReprojected.rt); + cmd.SetGlobalTexture(SSGI._HTraceBufferGI, finalOutput); + + // Copy color buffer + indirect lighting (without intensity multiplication) for multibounce + if (profile.GeneralSettings.Multibounce == true) + { + cmd.SetComputeTextureParam(SSGI.HTemporalReprojection, (int)SSGI.HTemporalReprojectionKernels.CopyHistory, SSGI._Radiance_History, _renderer.cameraColorTargetHandle); + cmd.SetComputeTextureParam(SSGI.HTemporalReprojection, (int)SSGI.HTemporalReprojectionKernels.CopyHistory, SSGI._Radiance_Output, SSGI.CameraHistorySystem.GetCameraData().ColorPreviousFrame.rt); + cmd.DispatchCompute(SSGI.HTemporalReprojection, (int)SSGI.HTemporalReprojectionKernels.CopyHistory, Mathf.CeilToInt(width / 8.0f), Mathf.CeilToInt(height / 8.0f), HRenderer.TextureXrSlices); + } + +#if UNITY_2023_3_OR_NEWER + if (profile.GeneralSettings.ExcludeReceivingMask != 0) + SSGI.ColorCompose_URP.EnableKeyword(SSGI.USE_RECEIVE_LAYER_MASK); +#endif + + // Inject final indirect lighting (with intensity multiplication) into color buffer via additive blending + CoreUtils.SetRenderTarget(cmd, _renderer.cameraColorTargetHandle); + SSGI.ColorCompose_URP.SetInt(SSGI._MetallicIndirectFallback, profile.GeneralSettings.MetallicIndirectFallback ? 1 : 0); + cmd.DrawProcedural(Matrix4x4.identity, SSGI.ColorCompose_URP, 2, MeshTopology.Triangles, 3, 1); + + ConfigureTarget(_renderer.cameraColorTargetHandle); + } + + SSGI.History.Update(); + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + return; + } + + #endregion --------------------------- Non Render Graph --------------------------- + + #region --------------------------- Render Graph --------------------------- + +#if UNITY_2023_3_OR_NEWER + private class PassData + { + public UniversalCameraData UniversalCameraData; + public TextureHandle ColorTexture; + public TextureHandle DepthTexture; + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + + using (var builder = renderGraph.AddUnsafePass(HNames.HTRACE_SSGI_PASS_NAME, out var passData, new ProfilingSampler(HNames.HTRACE_SSGI_PASS_NAME))) + { + UniversalResourceData resourceData = frameData.Get(); + UniversalCameraData universalCameraData = frameData.Get(); + UniversalRenderingData universalRenderingData = frameData.Get(); + UniversalLightData lightData = frameData.Get(); + + ConfigureInput(ScriptableRenderPassInput.Normal); + + builder.AllowGlobalStateModification(true); + builder.AllowPassCulling(false); + + RenderTextureDescriptor targetDesc = universalCameraData.cameraTargetDescriptor; + TextureHandle colorTexture = universalRenderingData.renderingMode == RenderingMode.Deferred +#if UNITY_6000_1_OR_NEWER + || universalRenderingData.renderingMode == RenderingMode.DeferredPlus +#endif + ? resourceData.activeColorTexture : resourceData.cameraColor; + TextureHandle depthTexture = universalRenderingData.renderingMode == RenderingMode.Deferred +#if UNITY_6000_1_OR_NEWER + || universalRenderingData.renderingMode == RenderingMode.DeferredPlus +#endif + ? resourceData.activeDepthTexture : resourceData.cameraDepth; + builder.UseTexture(colorTexture, AccessFlags.Write); + builder.UseTexture(resourceData.cameraNormalsTexture); + builder.UseTexture(resourceData.motionVectorColor); + + passData.UniversalCameraData = universalCameraData; + passData.ColorTexture = colorTexture; + passData.DepthTexture = depthTexture; + + Camera camera = universalCameraData.camera; + + SSGI.CameraHistorySystem.UpdateCameraHistoryIndex(camera.GetHashCode()); + SSGI.CameraHistorySystem.UpdateCameraHistoryData(); + SSGI.CameraHistorySystem.GetCameraData().SetHash(camera.GetHashCode()); + + SetupShared(camera, universalCameraData.renderScale, universalCameraData.cameraTargetDescriptor); + + builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context)); + } + + } + + private static void ExecutePass(PassData data, UnsafeGraphContext rgContext) + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + var cmd = CommandBufferHelpers.GetNativeCommandBuffer(rgContext.cmd); + + Camera camera = data.UniversalCameraData.camera; + float renderScale = data.UniversalCameraData.renderScale; + int width = (int)(camera.scaledPixelWidth * renderScale); + int height = (int)(camera.scaledPixelHeight * renderScale); + + if (Shader.GetGlobalTexture(CameraNormalsTexture) == null) + return; + + // ---------------------------------------- AMBIENT LIGHTING OVERRIDE ---------------------------------------- // + using (new ProfilingScope(cmd, SSGI.AmbientLightingOverrideSampler)) + { + cmd.SetGlobalFloat(SSGI._IndirectLightingIntensity, profile.SSGISettings.Intensity); + + if (profile.GeneralSettings.AmbientOverride) + { + // Copy Color buffer + CoreUtils.SetRenderTarget(cmd, SSGI.ColorCopy_URP.rt); + cmd.DrawProcedural(Matrix4x4.identity, SSGI.ColorCompose_URP, 0, MeshTopology.Triangles, 3, 1); + + // Subtract indirect lighting from Color buffer + CoreUtils.SetRenderTarget(cmd, data.ColorTexture); + SSGI.ColorCompose_URP.SetTexture(SSGI._ColorCopy, SSGI.ColorCopy_URP.rt); + cmd.DrawProcedural(Matrix4x4.identity, SSGI.ColorCompose_URP, 1, MeshTopology.Triangles, 3, 1); + } + + // Early out if we want to prview direct lighting only + if (profile.GeneralSettings.DebugMode == DebugMode.DirectLighting) + { + return; + } + } + + SSGI.Execute(cmd, camera, width, height, data.ColorTexture); + + // ---------------------------------------- INDIRECT LIGHTING INJECTION ---------------------------------------- // + using (new ProfilingScope(cmd, SSGI.IndirectLightingInjectionSampler)) + { + cmd.SetGlobalTexture(SSGI._HTraceBufferGI, SSGI.finalOutput); + + // Copy color buffer + indirect lighting (without intensity multiplication) for multibounce + if (profile.GeneralSettings.Multibounce == true) + { + cmd.SetComputeTextureParam(SSGI.HTemporalReprojection, (int)SSGI.HTemporalReprojectionKernels.CopyHistory, SSGI._Radiance_History, data.ColorTexture); + cmd.SetComputeTextureParam(SSGI.HTemporalReprojection, (int)SSGI.HTemporalReprojectionKernels.CopyHistory, SSGI._Radiance_Output, SSGI.CameraHistorySystem.GetCameraData().ColorPreviousFrame.rt); + cmd.DispatchCompute(SSGI.HTemporalReprojection, (int)SSGI.HTemporalReprojectionKernels.CopyHistory, Mathf.CeilToInt(width / 8.0f), Mathf.CeilToInt(height / 8.0f), HRenderer.TextureXrSlices); + } + +#if UNITY_2023_3_OR_NEWER + if (profile.GeneralSettings.ExcludeReceivingMask != 0) + SSGI.ColorCompose_URP.EnableKeyword(SSGI.USE_RECEIVE_LAYER_MASK); +#endif + + // Inject final indirect lighting (with intensity multiplication) into color buffer via additive blending + CoreUtils.SetRenderTarget(cmd, data.ColorTexture); + SSGI.ColorCompose_URP.SetInt(SSGI._MetallicIndirectFallback, profile.GeneralSettings.MetallicIndirectFallback ? 1 : 0); + cmd.DrawProcedural(Matrix4x4.identity, SSGI.ColorCompose_URP, 2, MeshTopology.Triangles, 3, 1); + } + + SSGI.History.Update(); + } +#endif + #endregion --------------------------- Render Graph --------------------------- + + #region ------------------------------------ Shared ------------------------------------ + private static void SetupShared(Camera camera, float renderScale, RenderTextureDescriptor desc) + { + HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; + + if (SSGI.HDebug == null) SSGI.HDebug = HExtensions.LoadComputeShader("HDebugSSGI"); + if (SSGI.HReSTIR == null) SSGI.HReSTIR = HExtensions.LoadComputeShader("HRestirSSGI"); + if (SSGI.HRenderSSGI == null) SSGI.HRenderSSGI = HExtensions.LoadComputeShader("HRenderSSGI"); + if (SSGI.HDenoiser == null) SSGI.HDenoiser = HExtensions.LoadComputeShader("HDenoiserSSGI"); + if (SSGI.HInterpolation == null) SSGI.HInterpolation = HExtensions.LoadComputeShader("HInterpolationSSGI"); + if (SSGI.HCheckerboarding == null) SSGI.HCheckerboarding = HExtensions.LoadComputeShader("HCheckerboardingSSGI"); + if (SSGI.PyramidGeneration == null) SSGI.PyramidGeneration = HExtensions.LoadComputeShader("HDepthPyramid"); + if (SSGI.HTemporalReprojection == null) SSGI.HTemporalReprojection = HExtensions.LoadComputeShader("HTemporalReprojectionSSGI"); + + if (SSGI.ColorCompose_URP == null) SSGI.ColorCompose_URP = new Material(Shader.Find($"Hidden/{HNames.ASSET_NAME}/ColorComposeURP")); + + int width = (int)(camera.scaledPixelWidth * renderScale); + int height = (int)(camera.scaledPixelHeight * renderScale); + if (desc.width != width || desc.height != height) + desc = new RenderTextureDescriptor(width, height); + + // Debug.Log($"All params in cameraTargetDescriptor: width: {desc.width}, height:{desc.height}, volumeDepth: {desc.volumeDepth}, depthBufferBits: {desc.depthBufferBits}, \n" + + // $"graphicsFormat: {desc.graphicsFormat}, colorFormat: {desc.colorFormat}, stencilFormat: {desc.stencilFormat}, msaaSamples: {desc.msaaSamples}, \n" + + // $"useMipMap: {desc.useMipMap}, autoGenerateMips: {desc.autoGenerateMips}, mipCount: {desc.mipCount}, \n" + + // $"enableRandomWrite: {desc.enableRandomWrite}, useDynamicScale: {desc.useDynamicScale}, "); + + desc.depthBufferBits = 0; // Color and depth cannot be combined in RTHandles + desc.stencilFormat = GraphicsFormat.None; + desc.depthStencilFormat = GraphicsFormat.None; + desc.msaaSamples = 1; + desc.bindMS = false; + desc.enableRandomWrite = true; + + ref var cameraData = ref SSGI.CameraHistorySystem.GetCameraData(); + if (cameraData.ColorPreviousFrame == null) cameraData.ColorPreviousFrame = new RTWrapper(); + if (cameraData.ReservoirTemporal == null) cameraData.ReservoirTemporal = new RTWrapper(); + if (cameraData.SampleCount == null) cameraData.SampleCount = new RTWrapper(); + if (cameraData.NormalDepth == null) cameraData.NormalDepth = new RTWrapper(); + if (cameraData.NormalDepthFullRes == null) cameraData.NormalDepthFullRes = new RTWrapper(); + if (cameraData.Radiance == null) cameraData.Radiance = new RTWrapper(); + if (cameraData.RadianceAccumulated == null) cameraData.RadianceAccumulated = new RTWrapper(); + if (cameraData.SpatialOcclusionAccumulated == null) cameraData.SpatialOcclusionAccumulated = new RTWrapper(); + if (cameraData.TemporalInvalidityAccumulated == null) cameraData.TemporalInvalidityAccumulated = new RTWrapper(); + if (cameraData.AmbientOcclusionAccumulated == null) cameraData.AmbientOcclusionAccumulated = new RTWrapper(); + + cameraData.ColorPreviousFrame.ReAllocateIfNeeded(_ColorPreviousFrame, ref desc, graphicsFormat: GraphicsFormat.B10G11R11_UFloatPack32); + cameraData.ReservoirTemporal.ReAllocateIfNeeded(_ReservoirTemporal, ref desc, graphicsFormat: GraphicsFormat.R32G32B32A32_UInt); + cameraData.TemporalInvalidityAccumulated.ReAllocateIfNeeded(_TemporalInvalidityAccumulated, ref desc, graphicsFormat: GraphicsFormat.R8G8_UNorm); + cameraData.SpatialOcclusionAccumulated.ReAllocateIfNeeded(_SpatialOcclusionAccumulated, ref desc, graphicsFormat: GraphicsFormat.R8_UNorm); + cameraData.AmbientOcclusionAccumulated.ReAllocateIfNeeded(_AmbientOcclusionAccumulated, ref desc, graphicsFormat: GraphicsFormat.R8_UNorm); + cameraData.Radiance.ReAllocateIfNeeded(_Radiance, ref desc, graphicsFormat: profile.DenoisingSettings.RecurrentBlur ? GraphicsFormat.R16G16B16A16_SFloat : GraphicsFormat.B10G11R11_UFloatPack32); + cameraData.RadianceAccumulated.ReAllocateIfNeeded(_RadianceAccumulated, ref desc, graphicsFormat: GraphicsFormat.R16G16B16A16_SFloat); + cameraData.SampleCount.ReAllocateIfNeeded(_SampleCount, ref desc, graphicsFormat: GraphicsFormat.R16_SFloat); + cameraData.NormalDepth.ReAllocateIfNeeded(_NormalDepthHistory, ref desc, graphicsFormat: GraphicsFormat.R32_UInt); + cameraData.NormalDepthFullRes.ReAllocateIfNeeded(_NormalDepthHistoryFullRes, ref desc, graphicsFormat: GraphicsFormat.R32_UInt); + + SSGI.ColorCopy_URP.ReAllocateIfNeeded(_ColorCopy, ref desc, graphicsFormat: GraphicsFormat.B10G11R11_UFloatPack32); + SSGI.DebugOutput.ReAllocateIfNeeded(_ColorCopy, ref desc, graphicsFormat: GraphicsFormat.B10G11R11_UFloatPack32); + SSGI.ColorReprojected.ReAllocateIfNeeded(_ColorReprojected, ref desc, graphicsFormat: GraphicsFormat.R32_UInt); + SSGI.Reservoir.ReAllocateIfNeeded(_Reservoir, ref desc, graphicsFormat: GraphicsFormat.R32G32B32A32_UInt); + SSGI.ReservoirReprojected.ReAllocateIfNeeded(_ReservoirReprojected, ref desc, graphicsFormat: GraphicsFormat.R32G32B32A32_UInt); + SSGI.ReservoirSpatial.ReAllocateIfNeeded(_ReservoirSpatial, ref desc, graphicsFormat: GraphicsFormat.R32G32B32A32_UInt); + SSGI.ReservoirLuminance.ReAllocateIfNeeded(_ReservoirLuminance, ref desc, graphicsFormat: GraphicsFormat.R16_SFloat); + SSGI.TemporalInvalidityFilteredA.ReAllocateIfNeeded(_TemporalInvalidityFilteredA, ref desc, graphicsFormat: GraphicsFormat.R8G8_UNorm); + SSGI.TemporalInvalidityFilteredB.ReAllocateIfNeeded(_TemporalInvalidityFilteredB, ref desc, graphicsFormat: GraphicsFormat.R8G8_UNorm); + SSGI.TemporalInvalidityReprojected.ReAllocateIfNeeded(_TemporalInvalidityReprojected, ref desc, graphicsFormat: GraphicsFormat.R8G8_UNorm); + SSGI.SpatialOcclusionReprojected.ReAllocateIfNeeded(_SpatialOcclusionReprojected, ref desc, graphicsFormat: GraphicsFormat.R8_UNorm); + SSGI.AmbientOcclusion.ReAllocateIfNeeded(_AmbientOcclusion, ref desc, graphicsFormat: GraphicsFormat.R8_SNorm); + SSGI.AmbientOcclusionGuidance.ReAllocateIfNeeded(_AmbientOcclusionGuidance, ref desc, graphicsFormat: GraphicsFormat.R8G8_UInt); + SSGI.AmbientOcclusionInvalidity.ReAllocateIfNeeded(_AmbientOcclusionInvalidity, ref desc, graphicsFormat: GraphicsFormat.R8_UNorm); + SSGI.AmbientOcclusionReprojected.ReAllocateIfNeeded(_AmbientOcclusionReprojected, ref desc, graphicsFormat: GraphicsFormat.R8_UNorm); + SSGI.RadianceFiltered.ReAllocateIfNeeded(_RadianceFiltered, ref desc, graphicsFormat: GraphicsFormat.B10G11R11_UFloatPack32); + SSGI.RadianceReprojected.ReAllocateIfNeeded(_RadianceReprojected, ref desc, graphicsFormat: GraphicsFormat.R16G16B16A16_SFloat); + SSGI.RadianceNormalDepth.ReAllocateIfNeeded(_RadianceNormalDepth, ref desc, graphicsFormat: GraphicsFormat.R32G32_UInt); + SSGI.RadianceInterpolated.ReAllocateIfNeeded(_RadianceInterpolated, ref desc, graphicsFormat: GraphicsFormat.B10G11R11_UFloatPack32); + SSGI.RadianceStabilizedReprojected.ReAllocateIfNeeded(_RadianceStabilizedReprojected, ref desc, graphicsFormat: GraphicsFormat.R16G16B16A16_SFloat); + SSGI.RadianceStabilized.ReAllocateIfNeeded(_RadianceStabilized, ref desc, graphicsFormat: GraphicsFormat.R16G16B16A16_SFloat); + SSGI.SamplecountReprojected.ReAllocateIfNeeded(_SamplecountReprojected, ref desc, graphicsFormat: GraphicsFormat.R16_SFloat); + SSGI.DummyBlackTexture.ReAllocateIfNeeded(_DummyBlackTexture, ref desc, graphicsFormat: GraphicsFormat.R8_UNorm); + + if (SSGI.PointDistributionBuffer == null) SSGI.PointDistributionBuffer = new ComputeBuffer(32 * 4 * HRenderer.TextureXrSlices, 3 * sizeof(int)); + if (SSGI.LuminanceMoments == null) SSGI.LuminanceMoments = new ComputeBuffer(2 * HRenderer.TextureXrSlices, 2 * sizeof(int)); + if (SSGI.IndirectArguments == null) SSGI.IndirectArguments = new ComputeBuffer(3 * HRenderer.TextureXrSlices, sizeof(int), ComputeBufferType.IndirectArguments); + if (SSGI.IndirectCoords == null) SSGI.IndirectCoords = new HDynamicBuffer(BufferType.ComputeBuffer, 2 * sizeof(uint), HRenderer.TextureXrSlices, avoidDownscale: false); + SSGI.IndirectCoords.ReAllocIfNeeded(new Vector2Int(width, height)); + + if (SSGI.RayCounter == null) + { + SSGI.RayCounter = new ComputeBuffer(2 * 1, sizeof(uint)); + uint[] zeroArray = new uint[2 * 1]; + SSGI.RayCounter.SetData(zeroArray); + } + } + + protected internal void Dispose() + { + var historyCameraDataSSGI = SSGI.CameraHistorySystem.GetCameraData(); + historyCameraDataSSGI.ColorPreviousFrame?.HRelease(); + historyCameraDataSSGI.ReservoirTemporal?.HRelease(); + historyCameraDataSSGI.SampleCount?.HRelease(); + historyCameraDataSSGI.NormalDepth?.HRelease(); + historyCameraDataSSGI.NormalDepthFullRes?.HRelease(); + historyCameraDataSSGI.Radiance?.HRelease(); + historyCameraDataSSGI.RadianceAccumulated?.HRelease(); + historyCameraDataSSGI.SpatialOcclusionAccumulated?.HRelease(); + historyCameraDataSSGI.TemporalInvalidityAccumulated?.HRelease(); + historyCameraDataSSGI.AmbientOcclusionAccumulated?.HRelease(); + + SSGI.ColorCopy_URP?.HRelease(); + SSGI.DebugOutput?.HRelease(); + SSGI.ColorReprojected?.HRelease(); + SSGI.Reservoir?.HRelease(); + SSGI.ReservoirReprojected?.HRelease(); + SSGI.ReservoirSpatial?.HRelease(); + SSGI.ReservoirLuminance?.HRelease(); + SSGI.TemporalInvalidityFilteredA?.HRelease(); + SSGI.TemporalInvalidityFilteredB?.HRelease(); + SSGI.TemporalInvalidityReprojected?.HRelease(); + SSGI.SpatialOcclusionReprojected?.HRelease(); + SSGI.AmbientOcclusion?.HRelease(); + SSGI.AmbientOcclusionGuidance?.HRelease(); + SSGI.AmbientOcclusionInvalidity?.HRelease(); + SSGI.AmbientOcclusionReprojected?.HRelease(); + SSGI.RadianceFiltered?.HRelease(); + SSGI.RadianceReprojected?.HRelease(); + SSGI.RadianceNormalDepth?.HRelease(); + SSGI.RadianceInterpolated?.HRelease(); + SSGI.RadianceStabilizedReprojected?.HRelease(); + SSGI.RadianceStabilized?.HRelease(); + SSGI.SamplecountReprojected?.HRelease(); + SSGI.DummyBlackTexture?.HRelease(); + + SSGI.PointDistributionBuffer.HRelease(); + SSGI.LuminanceMoments.HRelease(); + SSGI.RayCounter.HRelease(); + SSGI.IndirectCoords.HRelease(); + SSGI.IndirectArguments.HRelease(); + + SSGI.PointDistributionBuffer = null; + SSGI.LuminanceMoments = null; + SSGI.RayCounter = null; + SSGI.IndirectCoords = null; + SSGI.IndirectArguments = null; + } + #endregion ------------------------------------ Shared ------------------------------------ + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs.meta new file mode 100644 index 0000000..7b5010a --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 82482812f9bf9de4a878162fdf59954b +timeCreated: 1729952288 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Passes/URP/SSGIPassURP.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Patcher.meta b/Assets/Plugins/HTraceSSGI/Scripts/Patcher.meta new file mode 100644 index 0000000..10a0279 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Patcher.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5c9550853c2ae314088c0f219f0a04f3 +timeCreated: 1730454117 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs b/Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs new file mode 100644 index 0000000..c683226 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs @@ -0,0 +1,48 @@ +//pipelinedefine +#define H_URP + +#if UNITY_EDITOR +using UnityEditor; + +namespace HTraceSSGI.Scripts.Patcher +{ + //it's Raytracing Patcher for 2022 + public class InstalledPackage// : AssetPostprocessor + { +// [InitializeOnLoadMethod] + private static void InitializeOnLoad() + { +// #if UNITY_2022 +// string filePath_hRenderRTAO = Path.Combine(ConfiguratorUtils.GetHTraceFolderPath(), "Resources", "HTraceSSGI", "Computes", "HRenderRTAO.compute"); +// +// if (File.Exists(filePath_hRenderRTAO) && File.ReadAllLines(filePath_hRenderRTAO).Length > 10) +// { +// string[] hRenderRTAO2022 = new string[] +// { +// "#pragma kernel RenderRTAO", +// "[numthreads(8, 8, 1)]", +// "void RenderRTAO(uint3 pixCoord : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex, uint groupID : SV_GroupID)", +// "{", +// "}", +// }; +// +// File.WriteAllLines(filePath_hRenderRTAO, hRenderRTAO2022); +// } +// +// string filePath_hMainHSLS = Path.Combine(ConfiguratorUtils.GetHTraceFolderPath(), "Resources", "HTraceSSGI", "Headers", "HMain.hlsl"); +// if (File.Exists(filePath_hMainHSLS)) +// { +// string[] allLines_hMainHSLS = File.ReadAllLines(filePath_hMainHSLS); +// if (string.IsNullOrEmpty(allLines_hMainHSLS[3])) +// { +// allLines_hMainHSLS[3] = "#define _RTHandleScale float4(1.0f, 1.0f, 1.0f, 1.0f)"; +// File.WriteAllLines(filePath_hMainHSLS, allLines_hMainHSLS); +// } +// } +// +// AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); +// #endif + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs.meta new file mode 100644 index 0000000..b1b29fa --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a36a30b382dcbc14d8ff7380d9e2b473 +timeCreated: 1737699571 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Patcher/InstalledPackage.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator.meta b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator.meta new file mode 100644 index 0000000..8d8d6e8 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e00f51d0fe7b9fc4692645cfc5b3c9be +timeCreated: 1729006149 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs new file mode 100644 index 0000000..f2a9546 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs @@ -0,0 +1,84 @@ +//pipelinedefine +#define H_URP + +#if UNITY_EDITOR +using System; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace HTraceSSGI.Scripts.PipelelinesConfigurator +{ + public static class ConfiguratorUtils + { + public static string GetFullHdrpPath() + { + string targetPathStandart = Path.Combine(Directory.GetCurrentDirectory(), "Library", "PackageCache"); + string hdrpPathStandart = Directory.GetDirectories(targetPathStandart) + .FirstOrDefault(name => name.Contains("high-definition") && !name.Contains("config")); + string targetPathCustom = Path.Combine(Directory.GetCurrentDirectory(), "Packages"); + string hdrpPathCustom = Directory.GetDirectories(targetPathCustom) + .FirstOrDefault(name => name.Contains("high-definition") && !name.Contains("config")); + + if (string.IsNullOrEmpty(hdrpPathStandart) && string.IsNullOrEmpty(hdrpPathCustom)) + { + Debug.LogError($"HDRP path was not found there: {hdrpPathStandart}\n and there:\n{hdrpPathCustom}"); + } + + return string.IsNullOrEmpty(hdrpPathStandart) ? hdrpPathCustom : hdrpPathStandart; + } + + public static string GetHTraceFolderPath() + { + //string filePath = AssetDatabase.GetAssetPath(MonoScript.FromMonoBehaviour(this)); + string filePath = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); + string htraceFolder = Directory.GetParent(Directory.GetParent(Path.GetDirectoryName(filePath)).FullName).FullName; + return htraceFolder; + } + + public static string GetUnityAndHdrpVersion() + { + return $"Unity {Application.unityVersion}, HDRP version {GetHdrpVersion()}"; + } + + public static string GetHdrpVersion() + { + string fullHdrpPath = GetFullHdrpPath(); + string pathPackageJson = Path.Combine(fullHdrpPath, "package.json"); + string[] packageJson = File.ReadAllLines(pathPackageJson); + string hdrpVersion = string.Empty; + foreach (string line in packageJson) + { + if (line.Contains("version")) + { + hdrpVersion = line.Replace("version", "").Replace(" ", "").Replace(":", "").Replace(",", "").Replace("\"", ""); + break; + } + } + + return hdrpVersion; + } + + public static int GetMajorHdrpVersion() + { + string hdrpVersion = GetHdrpVersion(); + string[] split = hdrpVersion.Split('.'); + return Convert.ToInt32(split[0]); + } + + public static int GetMinorHdrpVersion() + { + string hdrpVersion = GetHdrpVersion(); + string[] split = hdrpVersion.Split('.'); + return Convert.ToInt32(split[1]); + } + + public static int GetPatchHdrpVersion() + { + string hdrpVersion = GetHdrpVersion(); + string[] split = hdrpVersion.Split('.'); + return Convert.ToInt32(split[2]); + } + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs.meta new file mode 100644 index 0000000..097f357 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 47b546814df5cef4797c41e297dc66d6 +timeCreated: 1729006593 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/PipelelinesConfigurator/ConfiguratorUtiles.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs new file mode 100644 index 0000000..628c34e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs @@ -0,0 +1,101 @@ +#if UNITY_EDITOR +using System.IO; +using System.Linq; +using HTraceSSGI.Scripts.Globals; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; + +namespace HTraceSSGI.Scripts.PipelelinesConfigurator +{ + internal class HPipelinesConfigurator + { + public static void UpdateDefines(HRenderPipeline hRenderPipeline) + { + string firstLine = "//pipelinedefine"; + + var hTraceFolderPath = ConfiguratorUtils.GetHTraceFolderPath(); + string supportedExtensions = "*.cs,*.hlsl,*.compute,*.glsl,*.shader"; + var filesPaths = Directory.GetFiles(hTraceFolderPath, "*.*", SearchOption.AllDirectories).Where(s => supportedExtensions.Contains(Path.GetExtension(s).ToLower())); + + foreach (string filePath in filesPaths) + { + string[] allLinesFile = File.ReadAllLines(filePath); + + if (allLinesFile[0] == firstLine) + { + switch (hRenderPipeline) + { + case HRenderPipeline.None: + allLinesFile[1] = "#define NONE"; + break; + case HRenderPipeline.BIRP: + if (allLinesFile[1] == "#define H_BIRP") + continue; + allLinesFile[1] = "#define H_BIRP"; + break; + case HRenderPipeline.URP: + if (allLinesFile[1] == "#define H_URP") + continue; + allLinesFile[1] = "#define H_URP"; + break; + case HRenderPipeline.HDRP: + if (allLinesFile[1] == "#define H_HDRP") + continue; + allLinesFile[1] = "#define H_HDRP"; + break; + } + } + else + { + continue; + } + + File.WriteAllLines(filePath, allLinesFile); + } + + Debug.Log($"Defines updated successfully {hRenderPipeline}!"); + } + + public static void AlwaysIncludedShaders() + { + AddShaderToGraphicsSettings("Hidden/HTraceSSGI/MotionVectorsURP"); + AddShaderToGraphicsSettings("Hidden/HTraceSSGI/ColorComposeURP"); + } + + public static void AddShaderToGraphicsSettings(string shaderName) + { + var shader = Shader.Find(shaderName); + if (shader == null) + return; + + var graphicsSettings = AssetDatabase.LoadAssetAtPath("ProjectSettings/GraphicsSettings.asset"); + var serializedObject = new SerializedObject(graphicsSettings); + var arrayProp = serializedObject.FindProperty("m_AlwaysIncludedShaders"); + bool hasShader = false; + for (int i = 0; i < arrayProp.arraySize; ++i) + { + var arrayElem = arrayProp.GetArrayElementAtIndex(i); + if (shader == arrayElem.objectReferenceValue) + { + hasShader = true; + break; + } + } + + if (!hasShader) + { + int arrayIndex = arrayProp.arraySize; + arrayProp.InsertArrayElementAtIndex(arrayIndex); + var arrayElem = arrayProp.GetArrayElementAtIndex(arrayIndex); + arrayElem.objectReferenceValue = shader; + + serializedObject.ApplyModifiedProperties(); + + AssetDatabase.SaveAssets(); + } + } + + } +} +#endif diff --git a/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs.meta new file mode 100644 index 0000000..99ce578 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 78d7385774d0ece4ab24703dc44d4f4f +timeCreated: 1729006583 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/PipelelinesConfigurator/HPipelinesConfigurator.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Services.meta b/Assets/Plugins/HTraceSSGI/Scripts/Services.meta new file mode 100644 index 0000000..0b24048 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Services.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 75704b5f697549a6b9bcc6dfb54dc963 +timeCreated: 1751368284 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs b/Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs new file mode 100644 index 0000000..2bd3be9 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs @@ -0,0 +1,8 @@ +namespace HTraceSSGI.Scripts.Services +{ + public interface IService + { + void Update(); + void Cleanup(); + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs.meta new file mode 100644 index 0000000..c8406cc --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Services/IService.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2a1440eebe644cd2bf2833e2b3da09c0 +timeCreated: 1751368305 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Services/IService.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Wrappers.meta b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers.meta new file mode 100644 index 0000000..2e1cd2e --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d734c775b6af014a966a5d793257ea7 +timeCreated: 1729184091 \ No newline at end of file diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs new file mode 100644 index 0000000..2aaab3c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs @@ -0,0 +1,92 @@ +using UnityEngine; + +namespace HTraceSSGI.Scripts.Wrappers +{ + public enum BufferType + { + ComputeBuffer, + GraphicsBuffer, + } + + public class HDynamicBuffer + { + private ComputeBuffer _computeBuffer; + private GraphicsBuffer _graphicsBuffer; + + private readonly BufferType _bufferType; + private readonly int _stride; + private int _count; + private int _countScale; + private Vector2Int _resolution; + private readonly ComputeBufferType _computeBufferType; + private readonly GraphicsBuffer.Target _graphicsBufferType; + private readonly bool _avoidDownscale; + + public ComputeBuffer ComputeBuffer => _computeBuffer; + public GraphicsBuffer GraphicsBuffer => _graphicsBuffer; + public int Count => _count; + public Vector2Int Resolution => _resolution; + + public bool IsCreated => _bufferType == BufferType.GraphicsBuffer ? _graphicsBuffer != null : _computeBuffer != null; + + public HDynamicBuffer(BufferType bufferType, int stride, int countScale = 1, + ComputeBufferType computeBufferType = ComputeBufferType.Default, GraphicsBuffer.Target graphicsBufferType = GraphicsBuffer.Target.Structured, + bool avoidDownscale = false) + { + _countScale = Mathf.Max(1, countScale); + _stride = stride; + _bufferType = bufferType; + _computeBufferType = computeBufferType; + _graphicsBufferType = graphicsBufferType; + _avoidDownscale = avoidDownscale; + } + + public void ReAllocIfNeeded(Vector2Int newResolution) + { + if (_resolution == newResolution) + return; + + if (_avoidDownscale == true && _resolution.x * _resolution.y > newResolution.x * newResolution.y) + return; + + Release(); + + _resolution = newResolution; + _count = newResolution.x * newResolution.y * _countScale; + + switch (_bufferType) + { + case BufferType.ComputeBuffer: + _computeBuffer = new ComputeBuffer(_count, _stride, _computeBufferType); + break; + case BufferType.GraphicsBuffer: + _graphicsBuffer = new GraphicsBuffer(_graphicsBufferType, _count, _stride); + break; + } + } + + public void SetBuffer(ComputeShader shader, string name, int kernelIndex) + { + switch (_bufferType) + { + case BufferType.ComputeBuffer: + shader.SetBuffer(kernelIndex, name, _computeBuffer); + break; + case BufferType.GraphicsBuffer: + shader.SetBuffer(kernelIndex, name, _graphicsBuffer); + break; + } + } + + public void Release() + { + _computeBuffer?.Release(); + _computeBuffer = null; + + _graphicsBuffer?.Release(); + _graphicsBuffer = null; + + _resolution = Vector2Int.zero; + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs.meta new file mode 100644 index 0000000..7eee65c --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a65c00cd4f01459a94fbdad28894645c +timeCreated: 1745925251 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Wrappers/HDynamicBuffer.cs + uploadId: 840002 diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs new file mode 100644 index 0000000..76224e2 --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs @@ -0,0 +1,105 @@ +//pipelinedefine +#define H_URP + +using HTraceSSGI.Scripts.Globals; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +namespace HTraceSSGI.Scripts.Wrappers +{ + public class RTWrapper + { + private RenderTextureDescriptor _dscr; + + public RTHandle rt; + + + + public void HTextureAlloc(string name, Vector2 scaleFactor, GraphicsFormat graphicsFormat, int volumeDepthOrSlices = -1, int depthBufferBits = 0, + TextureDimension textureDimension = TextureDimension.Unknown, + bool useMipMap = false, bool autoGenerateMips = false, bool enableRandomWrite = true, bool useDynamicScale = true) //useDynamicScale default = true for Upscalers switch between Hardware and Software + { + volumeDepthOrSlices = volumeDepthOrSlices == -1 ? TextureXR.slices : volumeDepthOrSlices; + textureDimension = textureDimension == TextureDimension.Unknown ? TextureXR.dimension : textureDimension; + + rt = RTHandles.Alloc(scaleFactor, volumeDepthOrSlices, dimension: textureDimension, colorFormat: graphicsFormat, name: name, + enableRandomWrite: enableRandomWrite, useMipMap: useMipMap, useDynamicScale: useDynamicScale, autoGenerateMips: autoGenerateMips, + depthBufferBits: (DepthBits)depthBufferBits); + } + + public void HTextureAlloc(string name, ScaleFunc scaleFunc, GraphicsFormat graphicsFormat, int volumeDepthOrSlices = -1, int depthBufferBits = 0, + TextureDimension textureDimension = TextureDimension.Unknown, + bool useMipMap = false, bool autoGenerateMips = false, bool enableRandomWrite = true, bool useDynamicScale = true) //useDynamicScale default = true for Upscalers switch between Hardware and Software + { + volumeDepthOrSlices = volumeDepthOrSlices == -1 ? TextureXR.slices : volumeDepthOrSlices; + textureDimension = textureDimension == TextureDimension.Unknown ? TextureXR.dimension : textureDimension; + + rt = RTHandles.Alloc(scaleFunc, volumeDepthOrSlices, dimension: textureDimension, colorFormat: graphicsFormat, name: name, + enableRandomWrite: enableRandomWrite, useMipMap: useMipMap, useDynamicScale: useDynamicScale, autoGenerateMips: autoGenerateMips, + depthBufferBits: (DepthBits)depthBufferBits); + } + + public void HTextureAlloc(string name, int width, int height, GraphicsFormat graphicsFormat, int volumeDepthOrSlices = -1, int depthBufferBits = 0, + TextureDimension textureDimension = TextureDimension.Unknown, + bool useMipMap = false, bool autoGenerateMips = false, bool enableRandomWrite = true, bool useDynamicScale = true) //useDynamicScale default = true for Upscalers switch between Hardware and Software + { + volumeDepthOrSlices = volumeDepthOrSlices == -1 ? TextureXR.slices : volumeDepthOrSlices; + textureDimension = textureDimension == TextureDimension.Unknown ? TextureXR.dimension : textureDimension; + + rt = RTHandles.Alloc(width, height, volumeDepthOrSlices, dimension: textureDimension, colorFormat: graphicsFormat, name: name, + enableRandomWrite: enableRandomWrite, useMipMap: useMipMap, useDynamicScale: useDynamicScale, autoGenerateMips: autoGenerateMips, + depthBufferBits: (DepthBits)depthBufferBits); + } + + public void HRelease() + { + RTHandles.Release(rt); + } + + public void ReAllocateIfNeeded(string name, ref RenderTextureDescriptor inputDescriptor, GraphicsFormat graphicsFormat = GraphicsFormat.None, + int width = -1, int height = -1, int volumeDepth = 1, + TextureDimension dimension = TextureDimension.Tex2D, + bool enableRandomWrite = true, bool useMipMap = false, bool autoGenerateMips = false, + bool useDynamicScale = false) + { + if (dimension != TextureDimension.Tex2D || width > 0 || height > 0) //conditions to create new descriptor + { + RenderTextureDescriptor newDesc = inputDescriptor; + + newDesc.width = width == -1 ? inputDescriptor.width : width; + newDesc.height = height == -1 ? inputDescriptor.height : height; + newDesc.volumeDepth = volumeDepth; + newDesc.dimension = dimension; + newDesc.graphicsFormat = graphicsFormat; + newDesc.autoGenerateMips = autoGenerateMips; + newDesc.useMipMap = useMipMap; + newDesc.enableRandomWrite = enableRandomWrite; + newDesc.msaaSamples = 1; + newDesc.useDynamicScale = false; + +#if UNITY_2023_3_OR_NEWER + RenderingUtils.ReAllocateHandleIfNeeded(ref rt, newDesc, name: name); +#else + RenderingUtils.ReAllocateIfNeeded(ref rt, newDesc, name: name); +#endif + return; + } + + inputDescriptor.volumeDepth = volumeDepth; + inputDescriptor.graphicsFormat = graphicsFormat; + inputDescriptor.autoGenerateMips = autoGenerateMips; + inputDescriptor.useMipMap = useMipMap; + inputDescriptor.enableRandomWrite = enableRandomWrite; + inputDescriptor.msaaSamples = 1; + inputDescriptor.useDynamicScale = false; + +#if UNITY_2023_3_OR_NEWER + RenderingUtils.ReAllocateHandleIfNeeded(ref rt, inputDescriptor, name: name); +#else + RenderingUtils.ReAllocateIfNeeded(ref rt, inputDescriptor, name: name); +#endif + } + } +} diff --git a/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs.meta b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs.meta new file mode 100644 index 0000000..31f80ce --- /dev/null +++ b/Assets/Plugins/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 36cadb88827714842b7a17d1c36ca0aa +timeCreated: 1729184161 +AssetOrigin: + serializedVersion: 1 + productId: 336896 + packageName: 'HTrace: Screen Space Global Illumination URP' + packageVersion: 1.2.0 + assetPath: Assets/HTraceSSGI/Scripts/Wrappers/RTWrapper.cs + uploadId: 840002

J?*zIi$h5W~^4B$I{y2G3k+KnXfJd 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 aDE%MBezcH>IZk%~0000c<@f9b-ief8O#RdUk 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