From fc2c0f82a0e53ea0dafc4d3b5930749266609ae1 Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 2 Dec 2021 19:03:04 +0100 Subject: [PATCH 01/11] Added conservative voxelization shader --- .../Lighting/ProbeVolume/VoxelizeScene.shader | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader index c978da58775..b545c306421 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader @@ -20,9 +20,10 @@ Shader "Hidden/ProbeVolume/VoxelizeScene" HLSLPROGRAM #pragma vertex vert + #pragma geometry geom #pragma fragment frag #pragma target 4.5 - // #pragma enable_d3d11_debug_symbols + #pragma enable_d3d11_debug_symbols #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" float4x4 unity_ObjectToWorld; @@ -33,15 +34,24 @@ Shader "Hidden/ProbeVolume/VoxelizeScene" float3 _VolumeSize; uint _AxisSwizzle; - struct VertexToFragment + struct VertexToGeometry { float4 vertex : SV_POSITION; float3 cellPos01 : TEXCOORD0; }; - VertexToFragment vert(float4 vertex : POSITION) + struct GeometryToFragment { - VertexToFragment o; + float4 vertex : SV_POSITION; + float3 cellPos01 : TEXCOORD0; + nointerpolation float2 minMaxX : TEXCOORD1; + nointerpolation float2 minMaxY : TEXCOORD2; + nointerpolation float2 minMaxZ : TEXCOORD3; + }; + + VertexToGeometry vert(float4 vertex : POSITION) + { + VertexToGeometry o; float3 cellPos = mul(unity_ObjectToWorld, vertex).xyz; cellPos -= _VolumeWorldOffset; @@ -70,8 +80,33 @@ Shader "Hidden/ProbeVolume/VoxelizeScene" return o; } - float4 frag(VertexToFragment i) : COLOR + [maxvertexcount(3)] + void geom(triangle VertexToGeometry inputVertex[3], inout TriangleStream triangleStream) { + float3 minPos = min(min(inputVertex[0].cellPos01, inputVertex[1].cellPos01), inputVertex[2].cellPos01) - rcp(_OutputSize.x); + float3 maxPos = max(max(inputVertex[0].cellPos01, inputVertex[1].cellPos01), inputVertex[2].cellPos01) + rcp(_OutputSize.x); + + for (int i = 0; i < 3; i++) + { + GeometryToFragment o; + o.vertex = inputVertex[i].vertex; + o.cellPos01 = inputVertex[i].cellPos01; + o.minMaxX = float2(minPos.x, maxPos.x); + o.minMaxY = float2(minPos.y, maxPos.y); + o.minMaxZ = float2(minPos.z, maxPos.z); + triangleStream.Append(o); + } + } + + float4 frag(GeometryToFragment i) : COLOR + { + if (i.cellPos01.x < i.minMaxX.x || i.cellPos01.x > i.minMaxX.y) + return 0; + if (i.cellPos01.y < i.minMaxY.x || i.cellPos01.y > i.minMaxY.y) + return 0; + if (i.cellPos01.z < i.minMaxZ.x || i.cellPos01.z > i.minMaxZ.y) + return 0; + if (any(i.cellPos01 < -EPSILON) || any(i.cellPos01 >= 1 + EPSILON)) return 0; From c004b08bc9a4cfb06c6bbf46042ef8ea1da5b51b Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 2 Dec 2021 19:04:09 +0100 Subject: [PATCH 02/11] Fix realtime cell debug --- .../Runtime/Lighting/ProbeVolume/ProbeVolume.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs index 6e9fa4dffb8..01549951c53 100644 --- a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs +++ b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs @@ -297,10 +297,7 @@ IEnumerable GetVisibleCellCentersAndState() } Matrix4x4 trs = Matrix4x4.TRS(ProbeReferenceVolume.instance.GetTransform().posWS, ProbeReferenceVolume.instance.GetTransform().rot, Vector3.one); - - // For realtime subdivision, the matrix from ProbeReferenceVolume.instance can be wrong if the profile changed since the last bake - if (debugDisplay.realtimeSubdivision) - trs = Matrix4x4.TRS(transform.position, Quaternion.identity, Vector3.one); + var oldGizmoMatrix = Gizmos.matrix; if (cellGizmo == null) cellGizmo = new MeshGizmo(); @@ -316,6 +313,7 @@ IEnumerable GetVisibleCellCentersAndState() cellGizmo.AddWireCube(center, Vector3.one * cellSizeInMeters, loaded ? new Color(0, 1, 0.5f, 1) : new Color(1, 0.0f, 0.0f, 1)); } cellGizmo.RenderWireframe(Gizmos.matrix, gizmoName: "Brick Gizmo Rendering"); + Gizmos.matrix = oldGizmoMatrix; } } #endregion From 37f01201c642a174ca31d28971991e1acf7ccdda Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 2 Dec 2021 19:21:44 +0100 Subject: [PATCH 03/11] Remove default geometry distance offset --- .../Runtime/Lighting/ProbeVolume/ProbeVolume.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs index 01549951c53..519fa9cf1ea 100644 --- a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs +++ b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs @@ -18,7 +18,7 @@ public class ProbeVolume : MonoBehaviour public bool globalVolume = false; public Vector3 size = new Vector3(10, 10, 10); [HideInInspector, Range(0f, 2f)] - public float geometryDistanceOffset = 0.2f; + public float geometryDistanceOffset = 0.0f; public LayerMask objectLayerMask = -1; From 433a624919e68db63a0f9280a16a322d196448d3 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 3 Dec 2021 13:25:15 +0100 Subject: [PATCH 04/11] Enable conservative --- .../Editor/Lighting/ProbeVolume/VoxelizeScene.shader | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader index b545c306421..34cfe6cbb92 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader @@ -17,6 +17,7 @@ Shader "Hidden/ProbeVolume/VoxelizeScene" ColorMask 0 ZWrite Off ZClip Off + Conservative True HLSLPROGRAM #pragma vertex vert From ea90f41e92665b14f89018c5986ea4cd9115a8d5 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 3 Dec 2021 13:33:55 +0100 Subject: [PATCH 05/11] comment debug --- .../Editor/Lighting/ProbeVolume/VoxelizeScene.shader | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader index 34cfe6cbb92..ee67072aefd 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/VoxelizeScene.shader @@ -24,7 +24,7 @@ Shader "Hidden/ProbeVolume/VoxelizeScene" #pragma geometry geom #pragma fragment frag #pragma target 4.5 - #pragma enable_d3d11_debug_symbols + // #pragma enable_d3d11_debug_symbols #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" float4x4 unity_ObjectToWorld; From 55a64097f552a0c6411172d7f70e8c92d081f25d Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 3 Dec 2021 18:03:13 +0100 Subject: [PATCH 06/11] Remove geometry distance offset and add min renderer bounding box volume field --- .../Editor/Lighting/ProbeVolume/ProbeGIBaking.cs | 9 +++++++++ .../Editor/Lighting/ProbeVolume/ProbePlacement.cs | 2 -- .../Lighting/ProbeVolume/ProbePlacement.cs.hlsl | 1 - .../Lighting/ProbeVolume/ProbeVolumeSubdivide.compute | 8 +------- .../Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs | 9 ++++++++- .../Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs | 3 ++- .../Lighting/ProbeVolume/SerializedProbeVolume.cs | 6 ++++-- .../ProbeVolume/ProbeReferenceVolumeProfile.cs | 11 +++++++++++ .../Runtime/Lighting/ProbeVolume/ProbeVolume.cs | 10 +++++++--- 9 files changed, 42 insertions(+), 17 deletions(-) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs index c2053bb727d..00b1aa4498b 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs @@ -732,9 +732,18 @@ public static ProbeSubdivisionResult BakeBricks(ProbeSubdivisionContext ctx) { var go = renderer.component.gameObject; int rendererLayerMask = 1 << go.layer; + renderer.volume.CalculateCenterAndSize(out _, out var rendererBoundsSize); + float rendererBoundsVolume = rendererBoundsSize.x * rendererBoundsSize.y * rendererBoundsSize.z; foreach (var probeVolume in overlappingProbeVolumes) { + // Skip renderers that have a smaller volume than the min volume size from the profile or probe volume component + float minRendererBoundingBoxSize = ctx.profile.minRendererVolumeSize; + if (probeVolume.component.overrideMinRendererVolumeSize) + minRendererBoundingBoxSize = probeVolume.component.minRendererVolumeSize; + if (rendererBoundsVolume < minRendererBoundingBoxSize) + continue; + if (ProbeVolumePositioning.OBBIntersect(renderer.volume, probeVolume.volume) && ProbeVolumePositioning.OBBIntersect(renderer.volume, cell.volume)) { diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs index d3506c75e51..53ac12a8d42 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs @@ -32,7 +32,6 @@ struct GPUProbeVolumeOBB public int minControllerSubdivLevel; public int maxControllerSubdivLevel; public int maxSubdivLevelInsideVolume; - public float geometryDistanceOffset; } public class GPUSubdivisionContext : IDisposable @@ -621,7 +620,6 @@ static void VoxelizeProbeVolumeData(CommandBuffer cmd, Bounds cellAABB, minControllerSubdivLevel = minSubdiv, maxControllerSubdivLevel = maxSubdiv, maxSubdivLevelInsideVolume = subdivLevel, - geometryDistanceOffset = kp.component.geometryDistanceOffset, }); } diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs.hlsl b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs.hlsl index 410c9cc9b9f..251780d3a73 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs.hlsl +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs.hlsl @@ -15,7 +15,6 @@ struct GPUProbeVolumeOBB int minControllerSubdivLevel; int maxControllerSubdivLevel; int maxSubdivLevelInsideVolume; - float geometryDistanceOffset; }; diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeSubdivide.compute b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeSubdivide.compute index 07d02d6910a..5cc236525f1 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeSubdivide.compute +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeSubdivide.compute @@ -200,7 +200,6 @@ bool PointInsideOBB(GPUProbeVolumeOBB obbA, GPUProbeVolumeOBB obbB) void VoxelizeProbeVolumeData(uint3 id : SV_DispatchThreadID) { float2 subdivisionLimits = float2(0, 0); - float maxGeometryDistance = -1e20; float maxSubdivLevelInsideVolume = 0; if (any(id >= uint3(_MaxBrickSize.xyz))) @@ -222,12 +221,11 @@ void VoxelizeProbeVolumeData(uint3 id : SV_DispatchThreadID) subdivisionLimits.x = max(subdivisionLimits.x, obb.minControllerSubdivLevel); subdivisionLimits.y = max(subdivisionLimits.y, obb.maxControllerSubdivLevel); - maxGeometryDistance = max(maxGeometryDistance, obb.geometryDistanceOffset); maxSubdivLevelInsideVolume = max(maxSubdivLevelInsideVolume, obb.maxSubdivLevelInsideVolume); } } - _Output[id] = float4(subdivisionLimits, maxGeometryDistance, maxSubdivLevelInsideVolume); + _Output[id] = float4(subdivisionLimits, 0, maxSubdivLevelInsideVolume); } [numthreads(8, 8, 1)] @@ -248,7 +246,6 @@ void Subdivide(uint3 id : SV_DispatchThreadID) if (_SubdivisionLevel < maxControllerSubdivLevel || _SubdivisionLevel > maxSubdivLevelInsideVolume) return; - uint3 sdfId = floor(position01 * _SDFSize.xyz); float dist = _Input[sdfId].r; @@ -259,9 +256,6 @@ void Subdivide(uint3 id : SV_DispatchThreadID) int minControllerSubdivLevel = _MaxSubdivisionLevel - subdivisionLevelData.x - 1; - // Add a small offset to control how the subdivision looks from the probe volume - voxelDetectionDistance += subdivisionLevelData.z * rcp(_MaxBrickSize.x); - if (dist <= voxelDetectionDistance || _SubdivisionLevel > minControllerSubdivLevel) { // transform id to world position diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs index 62d67a3629d..5a13b6df661 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs @@ -208,7 +208,14 @@ static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner) EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serialized.objectLayerMask, Styles.s_ObjectLayerMask); - EditorGUILayout.PropertyField(serialized.geometryDistanceOffset, Styles.s_GeometryDistanceOffset); + + EditorGUILayout.PropertyField(serialized.overrideMinRendererVolumeSize, Styles.s_OverrideMinRendererVolumeSize); + if (serialized.overrideMinRendererVolumeSize.boolValue) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(serialized.minRendererVolumeSize, Styles.s_MinRendererVolumeSize); + EditorGUI.indentLevel--; + } EditorGUI.indentLevel--; } } diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs index 54224ab9ce9..9b4776d00be 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs @@ -12,7 +12,8 @@ internal static class Styles internal static readonly GUIContent s_HighestSubdivLevel = new GUIContent("Highest Subdivision Level", "Overrides the highest subdivision level used by the system. This determines how finely a probe volume is subdivided, lower values means larger minimum distance between probes."); internal static readonly GUIContent s_LowestSubdivLevel = new GUIContent("Lowest Subdivision Level", "Overrides the lowest subdivision level used by the system. This determines how coarsely a probe volume is allowed to be subdivided, higher values means smaller maximum distance between probes."); internal static readonly GUIContent s_ObjectLayerMask = new GUIContent("Layer Mask", "Control which layers will be used to select the meshes for the probe placement algorithm."); - internal static readonly GUIContent s_GeometryDistanceOffset = new GUIContent("Probe Placement Distance Offset", "Affects the minimum distance at which the subdivision system will attempts to place probes near the geometry. This value can be useful in situations where the generated probes don't fully cover an object."); + internal static readonly GUIContent s_MinRendererVolumeSize = new GUIContent("Minimum Renderer Volume Size", "Specifies the minimum bounding box volume of renderers to consider placing probes around."); + internal static readonly GUIContent s_OverrideMinRendererVolumeSize = new GUIContent("Override Renderer Filters", "Overrides the Minimum Renderer Volume Size specified in the Probe Volume Settings Window."); internal static readonly string s_ProbeVolumeChangedMessage = "The probe volume has changed since last baking or the data was never baked.\nPlease bake lighting in the lighting panel to update the lighting data."; internal static readonly Color k_GizmoColorBase = new Color32(137, 222, 144, 255); diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs index b6900e1b628..352bb36b6ca 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs @@ -10,7 +10,8 @@ internal class SerializedProbeVolume internal SerializedProperty highestSubdivisionLevelOverride; internal SerializedProperty lowestSubdivisionLevelOverride; internal SerializedProperty objectLayerMask; - internal SerializedProperty geometryDistanceOffset; + internal SerializedProperty minRendererVolumeSize; + internal SerializedProperty overrideMinRendererVolumeSize; internal SerializedObject serializedObject; @@ -21,7 +22,8 @@ internal SerializedProbeVolume(SerializedObject obj) globalVolume = serializedObject.FindProperty("globalVolume"); size = serializedObject.FindProperty("size"); objectLayerMask = serializedObject.FindProperty("objectLayerMask"); - geometryDistanceOffset = serializedObject.FindProperty("geometryDistanceOffset"); + minRendererVolumeSize = serializedObject.FindProperty("minRendererVolumeSize"); + overrideMinRendererVolumeSize = serializedObject.FindProperty("overrideMinRendererVolumeSize"); highestSubdivisionLevelOverride = serializedObject.FindProperty("highestSubdivLevelOverride"); lowestSubdivisionLevelOverride = serializedObject.FindProperty("lowestSubdivLevelOverride"); overridesSubdivision = serializedObject.FindProperty("overridesSubdivLevels"); diff --git a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs index 6c3533d6286..ef09bc0c53a 100644 --- a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs +++ b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs @@ -50,6 +50,12 @@ internal enum Version /// public float cellSizeInMeters => (float)cellSizeInBricks * minBrickSize; + /// + /// Specifies the minimum bounding box volume of renderers to consider placing probes around. + /// + [Min(0)] + public float minRendererVolumeSize = 0.1f; + void OnEnable() { if (version != CoreUtils.GetLastEnumValue()) @@ -79,6 +85,7 @@ internal class ProbeReferenceVolumeProfileEditor : Editor SerializedProperty m_CellSize; SerializedProperty m_MinDistanceBetweenProbes; SerializedProperty m_SimplificationLevels; + SerializedProperty m_MinRendererVolumeSize; ProbeReferenceVolumeProfile profile => target as ProbeReferenceVolumeProfile; static class Styles @@ -88,6 +95,7 @@ static class Styles public static readonly string simplificationLevelsHighWarning = "High simplification levels have a big memory overhead, they are not recommended except for testing purposes."; public static readonly GUIContent minDistanceBetweenProbes = new GUIContent("Min Distance Between Probes", "The minimal distance between two probes in meters."); public static readonly GUIContent indexDimensions = new GUIContent("Index Dimensions", "The dimensions of the index buffer."); + public static readonly GUIContent minRendererVolumeSize = new GUIContent("Minimum Renderer Volume Size", "Specifies the minimum bounding box volume of renderers to consider placing probes around."); } void OnEnable() @@ -95,6 +103,7 @@ void OnEnable() m_CellSize = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.cellSizeInBricks)); m_MinDistanceBetweenProbes = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.minDistanceBetweenProbes)); m_SimplificationLevels = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.simplificationLevels)); + m_MinRendererVolumeSize = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.minRendererVolumeSize)); } public override void OnInspectorGUI() @@ -109,6 +118,8 @@ public override void OnInspectorGUI() } EditorGUILayout.PropertyField(m_MinDistanceBetweenProbes, Styles.minDistanceBetweenProbes); EditorGUILayout.HelpBox($"The distance between probes will fluctuate between : {profile.minDistanceBetweenProbes}m and {profile.cellSizeInMeters / 3.0f}m", MessageType.Info); + + EditorGUILayout.PropertyField(m_MinRendererVolumeSize, Styles.minRendererVolumeSize); if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties(); diff --git a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs index 519fa9cf1ea..bd44fbc0a81 100644 --- a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs +++ b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs @@ -17,8 +17,10 @@ public class ProbeVolume : MonoBehaviour { public bool globalVolume = false; public Vector3 size = new Vector3(10, 10, 10); - [HideInInspector, Range(0f, 2f)] - public float geometryDistanceOffset = 0.0f; + [HideInInspector, Min(0)] + public bool overrideMinRendererVolumeSize = false; + [HideInInspector, Min(0)] + public float minRendererVolumeSize = 0.1f; public LayerMask objectLayerMask = -1; @@ -115,7 +117,9 @@ public override int GetHashCode() hash = hash * 23 + overridesSubdivLevels.GetHashCode(); hash = hash * 23 + highestSubdivLevelOverride.GetHashCode(); hash = hash * 23 + lowestSubdivLevelOverride.GetHashCode(); - hash = hash * 23 + geometryDistanceOffset.GetHashCode(); + hash = hash * 23 + overrideMinRendererVolumeSize.GetHashCode(); + if (overrideMinRendererVolumeSize) + hash = hash * 23 + minRendererVolumeSize.GetHashCode(); hash = hash * 23 + objectLayerMask.GetHashCode(); } From 025aebefd7818bc99ab60f7148427e5a4d343832 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 3 Dec 2021 18:05:25 +0100 Subject: [PATCH 07/11] Fix baking window style --- .../Editor/Lighting/ProbeVolume/ProbeVolumeBakingWindow.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBakingWindow.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBakingWindow.cs index 5b40e5356ee..06a27aac2a6 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBakingWindow.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBakingWindow.cs @@ -409,10 +409,10 @@ void DelayCreateAsset() if (m_ProbeVolumeProfileEditor.target != set.profile) Editor.CreateCachedEditor(set.profile, m_ProbeVolumeProfileEditor.GetType(), ref m_ProbeVolumeProfileEditor); - EditorGUILayout.LabelField("Probe Volume Profile", EditorStyles.largeLabel); + EditorGUILayout.LabelField("Probe Volume Profile", EditorStyles.boldLabel); + EditorGUI.indentLevel++; m_ProbeVolumeProfileEditor.OnInspectorGUI(); - - EditorGUILayout.Space(); + EditorGUI.indentLevel--; var serializedSets = m_ProbeSceneData.FindPropertyRelative("serializedBakingSets"); var serializedSet = serializedSets.GetArrayElementAtIndex(m_BakingSets.index); From 8e9a21f5a37ec85d0e69dbca2e01e2831fb764ef Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 3 Dec 2021 18:05:30 +0100 Subject: [PATCH 08/11] Updated changelog --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 41148683b86..bf595cb52dc 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Changed sample scene in HDRP material samples: add shadow transparency (raster, ray-traced, path-traced). - Support for encoded HDR cubemaps, configurable via the HDR Cubemap Encoding project setting. - The rendering order of decals that have a similar draw order value was modified. The new order should be the reverse of the previous order. +- Improved the probe placement of APV when dealing with scenes that contains objects smaller than a brick. +- Replaced the geometry distance offset in the Probe Volume component by a minimum renderer volume threshold to ignore small objects when placing probes. ### Fixed - Fixed some XR devices: Pulling camera world space position from mainViewConstants instead of transform. From ce7f0e6878635db0ea5dfdbc841aa967c6852f0b Mon Sep 17 00:00:00 2001 From: alelievr Date: Tue, 7 Dec 2021 17:22:32 +0100 Subject: [PATCH 09/11] Added probe volume layer mask in APV profile --- .../Lighting/ProbeVolume/ProbeGIBaking.cs | 9 +++++++-- .../ProbeVolume/ProbeVolumeUI.Drawer.cs | 11 +++++------ .../ProbeVolume/ProbeVolumeUI.Skin.cs | 4 ++-- .../ProbeVolume/SerializedProbeVolume.cs | 4 ++-- .../ProbeReferenceVolumeProfile.cs | 19 ++++++++++++++++--- .../Lighting/ProbeVolume/ProbeVolume.cs | 12 +++++++----- 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs index 00b1aa4498b..52c33a63923 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs @@ -739,7 +739,7 @@ public static ProbeSubdivisionResult BakeBricks(ProbeSubdivisionContext ctx) { // Skip renderers that have a smaller volume than the min volume size from the profile or probe volume component float minRendererBoundingBoxSize = ctx.profile.minRendererVolumeSize; - if (probeVolume.component.overrideMinRendererVolumeSize) + if (probeVolume.component.overrideRendererFilters) minRendererBoundingBoxSize = probeVolume.component.minRendererVolumeSize; if (rendererBoundsVolume < minRendererBoundingBoxSize) continue; @@ -747,8 +747,13 @@ public static ProbeSubdivisionResult BakeBricks(ProbeSubdivisionContext ctx) if (ProbeVolumePositioning.OBBIntersect(renderer.volume, probeVolume.volume) && ProbeVolumePositioning.OBBIntersect(renderer.volume, cell.volume)) { + var layerMask = ctx.profile.renderersLayerMask; + + if (probeVolume.component.overrideRendererFilters) + layerMask = probeVolume.component.objectLayerMask; + // Check if the renderer has a matching layer with probe volume - if ((probeVolume.component.objectLayerMask & rendererLayerMask) != 0) + if ((layerMask & rendererLayerMask) != 0) { validRenderers.Add(renderer); scenesInCell.Add(go.scene); diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs index 5a13b6df661..09d271bf822 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs @@ -148,8 +148,10 @@ static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner) EditorGUI.BeginDisabledGroup(!hasProfile); var rect = EditorGUILayout.GetControlRect(true); + EditorGUI.indentLevel++; EditorGUI.BeginProperty(rect, Styles.s_HighestSubdivLevel, serialized.highestSubdivisionLevelOverride); EditorGUI.BeginProperty(rect, Styles.s_LowestSubdivLevel, serialized.lowestSubdivisionLevelOverride); + EditorGUI.indentLevel--; // Round min and max subdiv int maxSubdiv = ProbeReferenceVolume.instance.GetMaxSubdivision() - 1; @@ -206,17 +208,14 @@ static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner) EditorGUILayout.LabelField("Geometry Settings", EditorStyles.boldLabel); - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(serialized.objectLayerMask, Styles.s_ObjectLayerMask); - - EditorGUILayout.PropertyField(serialized.overrideMinRendererVolumeSize, Styles.s_OverrideMinRendererVolumeSize); - if (serialized.overrideMinRendererVolumeSize.boolValue) + EditorGUILayout.PropertyField(serialized.overrideRendererFilters, Styles.s_OverrideRendererFilters); + if (serialized.overrideRendererFilters.boolValue) { EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(serialized.objectLayerMask, Styles.s_ObjectLayerMask); EditorGUILayout.PropertyField(serialized.minRendererVolumeSize, Styles.s_MinRendererVolumeSize); EditorGUI.indentLevel--; } - EditorGUI.indentLevel--; } } } diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs index 9b4776d00be..9b9444cc3c4 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Skin.cs @@ -12,8 +12,8 @@ internal static class Styles internal static readonly GUIContent s_HighestSubdivLevel = new GUIContent("Highest Subdivision Level", "Overrides the highest subdivision level used by the system. This determines how finely a probe volume is subdivided, lower values means larger minimum distance between probes."); internal static readonly GUIContent s_LowestSubdivLevel = new GUIContent("Lowest Subdivision Level", "Overrides the lowest subdivision level used by the system. This determines how coarsely a probe volume is allowed to be subdivided, higher values means smaller maximum distance between probes."); internal static readonly GUIContent s_ObjectLayerMask = new GUIContent("Layer Mask", "Control which layers will be used to select the meshes for the probe placement algorithm."); - internal static readonly GUIContent s_MinRendererVolumeSize = new GUIContent("Minimum Renderer Volume Size", "Specifies the minimum bounding box volume of renderers to consider placing probes around."); - internal static readonly GUIContent s_OverrideMinRendererVolumeSize = new GUIContent("Override Renderer Filters", "Overrides the Minimum Renderer Volume Size specified in the Probe Volume Settings Window."); + internal static readonly GUIContent s_MinRendererVolumeSize = new GUIContent("Min Volume Size", "Specifies the minimum bounding box volume of renderers to consider placing probes around."); + internal static readonly GUIContent s_OverrideRendererFilters = new GUIContent("Override Renderer Filters", "Overrides the filters used to select renderers for the probe placement."); internal static readonly string s_ProbeVolumeChangedMessage = "The probe volume has changed since last baking or the data was never baked.\nPlease bake lighting in the lighting panel to update the lighting data."; internal static readonly Color k_GizmoColorBase = new Color32(137, 222, 144, 255); diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs index 352bb36b6ca..4d52c5f56c6 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/SerializedProbeVolume.cs @@ -11,7 +11,7 @@ internal class SerializedProbeVolume internal SerializedProperty lowestSubdivisionLevelOverride; internal SerializedProperty objectLayerMask; internal SerializedProperty minRendererVolumeSize; - internal SerializedProperty overrideMinRendererVolumeSize; + internal SerializedProperty overrideRendererFilters; internal SerializedObject serializedObject; @@ -23,7 +23,7 @@ internal SerializedProbeVolume(SerializedObject obj) size = serializedObject.FindProperty("size"); objectLayerMask = serializedObject.FindProperty("objectLayerMask"); minRendererVolumeSize = serializedObject.FindProperty("minRendererVolumeSize"); - overrideMinRendererVolumeSize = serializedObject.FindProperty("overrideMinRendererVolumeSize"); + overrideRendererFilters = serializedObject.FindProperty("overrideRendererFilters"); highestSubdivisionLevelOverride = serializedObject.FindProperty("highestSubdivLevelOverride"); lowestSubdivisionLevelOverride = serializedObject.FindProperty("lowestSubdivLevelOverride"); overridesSubdivision = serializedObject.FindProperty("overridesSubdivLevels"); diff --git a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs index ef09bc0c53a..c15256a8262 100644 --- a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs +++ b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolumeProfile.cs @@ -50,6 +50,11 @@ internal enum Version /// public float cellSizeInMeters => (float)cellSizeInBricks * minBrickSize; + /// + /// Layer mask filter for all renderers. + /// + public LayerMask renderersLayerMask = -1; + /// /// Specifies the minimum bounding box volume of renderers to consider placing probes around. /// @@ -73,7 +78,8 @@ public bool IsEquivalent(ProbeReferenceVolumeProfile otherProfile) { return minDistanceBetweenProbes == otherProfile.minDistanceBetweenProbes && cellSizeInMeters == otherProfile.cellSizeInMeters && - simplificationLevels == otherProfile.simplificationLevels; + simplificationLevels == otherProfile.simplificationLevels && + renderersLayerMask == otherProfile.renderersLayerMask; } } @@ -86,6 +92,7 @@ internal class ProbeReferenceVolumeProfileEditor : Editor SerializedProperty m_MinDistanceBetweenProbes; SerializedProperty m_SimplificationLevels; SerializedProperty m_MinRendererVolumeSize; + SerializedProperty m_RenderersLayerMask; ProbeReferenceVolumeProfile profile => target as ProbeReferenceVolumeProfile; static class Styles @@ -95,7 +102,8 @@ static class Styles public static readonly string simplificationLevelsHighWarning = "High simplification levels have a big memory overhead, they are not recommended except for testing purposes."; public static readonly GUIContent minDistanceBetweenProbes = new GUIContent("Min Distance Between Probes", "The minimal distance between two probes in meters."); public static readonly GUIContent indexDimensions = new GUIContent("Index Dimensions", "The dimensions of the index buffer."); - public static readonly GUIContent minRendererVolumeSize = new GUIContent("Minimum Renderer Volume Size", "Specifies the minimum bounding box volume of renderers to consider placing probes around."); + public static readonly GUIContent minRendererVolumeSize = new GUIContent("Min Renderer Volume Size", "Specifies the minimum bounding box volume of renderers to consider placing probes around."); + public static readonly GUIContent renderersLayerMask = new GUIContent("Layer Mask", "Specifies the layer mask for renderers when placing probes."); } void OnEnable() @@ -104,6 +112,7 @@ void OnEnable() m_MinDistanceBetweenProbes = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.minDistanceBetweenProbes)); m_SimplificationLevels = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.simplificationLevels)); m_MinRendererVolumeSize = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.minRendererVolumeSize)); + m_RenderersLayerMask = serializedObject.FindProperty(nameof(ProbeReferenceVolumeProfile.renderersLayerMask)); } public override void OnInspectorGUI() @@ -118,8 +127,12 @@ public override void OnInspectorGUI() } EditorGUILayout.PropertyField(m_MinDistanceBetweenProbes, Styles.minDistanceBetweenProbes); EditorGUILayout.HelpBox($"The distance between probes will fluctuate between : {profile.minDistanceBetweenProbes}m and {profile.cellSizeInMeters / 3.0f}m", MessageType.Info); - + + EditorGUILayout.LabelField("Renderers Filter Settings", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(m_RenderersLayerMask, Styles.renderersLayerMask); EditorGUILayout.PropertyField(m_MinRendererVolumeSize, Styles.minRendererVolumeSize); + EditorGUI.indentLevel--; if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties(); diff --git a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs index a91653fd379..d6574590f4e 100644 --- a/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs +++ b/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs @@ -26,10 +26,10 @@ public class ProbeVolume : MonoBehaviour public Vector3 size = new Vector3(10, 10, 10); /// - /// Override the minimum renderer bounding box volume size. + /// Override the renderer filters. /// [HideInInspector, Min(0)] - public bool overrideMinRendererVolumeSize = false; + public bool overrideRendererFilters = false; /// /// The minimum renderer bounding box volume size. This value is used to discard small renderers when the overrideMinRendererVolumeSize is enabled. @@ -145,10 +145,12 @@ public override int GetHashCode() hash = hash * 23 + overridesSubdivLevels.GetHashCode(); hash = hash * 23 + highestSubdivLevelOverride.GetHashCode(); hash = hash * 23 + lowestSubdivLevelOverride.GetHashCode(); - hash = hash * 23 + overrideMinRendererVolumeSize.GetHashCode(); - if (overrideMinRendererVolumeSize) + hash = hash * 23 + overrideRendererFilters.GetHashCode(); + if (overrideRendererFilters) + { hash = hash * 23 + minRendererVolumeSize.GetHashCode(); - hash = hash * 23 + objectLayerMask.GetHashCode(); + hash = hash * 23 + objectLayerMask.GetHashCode(); + } } return hash; From 0088431418b47d632f905ac8716264367f246247 Mon Sep 17 00:00:00 2001 From: alelievr Date: Tue, 7 Dec 2021 17:22:41 +0100 Subject: [PATCH 10/11] Updated changelog --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 5b6f9bbc616..da2925863ad 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -62,6 +62,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed default value of "Distortion Blur" from 1 to 0 according to the doc. - Fixed Transparent Depth Pre/Post pass by default for the built-in HDRP Hair shader graph. +### Added +- Added a Layer Mask in the Probe Volume Settings window to filter which renderers to consider when placing the probes. + ## [13.1.2] - 2021-11-05 ### Added From 270c53b8e0a2faa381344bf61de8b4d7d08f3f3e Mon Sep 17 00:00:00 2001 From: alelievr Date: Tue, 7 Dec 2021 17:38:30 +0100 Subject: [PATCH 11/11] Fix indent --- .../Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs index 09d271bf822..b473ad23589 100644 --- a/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs +++ b/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeUI.Drawer.cs @@ -148,10 +148,8 @@ static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner) EditorGUI.BeginDisabledGroup(!hasProfile); var rect = EditorGUILayout.GetControlRect(true); - EditorGUI.indentLevel++; EditorGUI.BeginProperty(rect, Styles.s_HighestSubdivLevel, serialized.highestSubdivisionLevelOverride); EditorGUI.BeginProperty(rect, Styles.s_LowestSubdivLevel, serialized.lowestSubdivisionLevelOverride); - EditorGUI.indentLevel--; // Round min and max subdiv int maxSubdiv = ProbeReferenceVolume.instance.GetMaxSubdivision() - 1; @@ -181,9 +179,12 @@ static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner) if (serialized.highestSubdivisionLevelOverride.intValue < 0) serialized.highestSubdivisionLevelOverride.intValue = maxSubdiv; - serialized.highestSubdivisionLevelOverride.intValue = Mathf.Min(maxSubdiv, EditorGUILayout.IntSlider(Styles.s_HighestSubdivLevel, serialized.highestSubdivisionLevelOverride.intValue, 0, maxSubdiv)); - serialized.lowestSubdivisionLevelOverride.intValue = Mathf.Min(maxSubdiv, EditorGUILayout.IntSlider(Styles.s_LowestSubdivLevel, serialized.lowestSubdivisionLevelOverride.intValue, 0, maxSubdiv)); - serialized.lowestSubdivisionLevelOverride.intValue = Mathf.Min(serialized.lowestSubdivisionLevelOverride.intValue, serialized.highestSubdivisionLevelOverride.intValue); + using (new EditorGUI.IndentLevelScope()) + { + serialized.highestSubdivisionLevelOverride.intValue = Mathf.Min(maxSubdiv, EditorGUILayout.IntSlider(Styles.s_HighestSubdivLevel, serialized.highestSubdivisionLevelOverride.intValue, 0, maxSubdiv)); + serialized.lowestSubdivisionLevelOverride.intValue = Mathf.Min(maxSubdiv, EditorGUILayout.IntSlider(Styles.s_LowestSubdivLevel, serialized.lowestSubdivisionLevelOverride.intValue, 0, maxSubdiv)); + serialized.lowestSubdivisionLevelOverride.intValue = Mathf.Min(serialized.lowestSubdivisionLevelOverride.intValue, serialized.highestSubdivisionLevelOverride.intValue); + } EditorGUI.EndProperty(); EditorGUI.EndProperty();