Skip to content

Commit ee96637

Browse files
committed
Fix recursive mutation bug in ZH Fit version of ProbePropagationInitialize projection.
Dynamic GI Propagation: Sample Neighbors: Use ZH-Fit to convert from SH to our 26-axis basis - it produces results that are a bit closer to our monte carlo naive projection ground truth Dynamic GI: Fix Infinite Bounce calculation after we changed our basis coefficients. We were missing scaling each lobe contribution by that lobes normalized integral. Also delete some dead code that was hanging around in the dynamic GI area for too long, and fix some code erroneously included inside of an ifdef (#109) Dynamic GI probe dirty flag (#111) * Store a dirty flag for each light probe in a volume, update only the ones that had reasons to change since the last update. * Added a setting to Frame Setting to be able to disable dirty flags. * Added debug visualisation of dirty probes of all active volumes. DGI propagation fixes (#112) * Fixed fallback radiance baking when dirty flags are enabled. * Fixed noticeable intensity loss for lower propagation quality due to axis weights renormalization error. * Separate radiance comparison for LogLUV encoding that avoids many false positives in dirty flags. * Fixed propagation data not being cleared when Frame Settings are changed via the settings window causing the pipeline to be destroyed. critical exception fix that was firing on domain reloads & enter play mode transitions
1 parent 1bdf5e9 commit ee96637

25 files changed

+650
-253
lines changed

com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ static void Drawer_SectionLightingSettings(SerializedFrameSettings serialized, E
349349
);
350350
area.AmmendInfo(FrameSettingsField.ProbeVolumeDynamicGI, overrideable: () => hdrpSettings.supportProbeVolume && hdrpSettings.supportProbeVolumeDynamicGI);
351351
area.AmmendInfo(FrameSettingsField.ProbeVolumeDynamicGIInfiniteBounces, overrideable: () => hdrpSettings.supportProbeVolume && hdrpSettings.supportProbeVolumeDynamicGI);
352+
area.AmmendInfo(FrameSettingsField.ProbeVolumeDynamicGIDirtyFlagsDisabled, overrideable: () => hdrpSettings.supportProbeVolume && hdrpSettings.supportProbeVolumeDynamicGI);
352353
area.AmmendInfo(FrameSettingsField.ProbeVolumeDynamicGIPropagationQuality,
353354
customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.probeVolumeDynamicGIPropagationQuality.intValue, // 3 levels
354355
customSetter: v => serialized.probeVolumeDynamicGIPropagationQuality.intValue = Math.Max(0, Math.Min((int)v, 2)), // Levels 0-2

com.unity.render-pipelines.high-definition/Runtime/Debug/LightingDebug.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ internal enum ProbeVolumeDebugMode
201201
None,
202202
VisualizeAtlas,
203203
VisualizeDebugColors,
204-
VisualizeValidity
204+
VisualizeValidity,
205+
VisualizeDynamicGIDirtyFlags
205206
}
206207

207208
/// <summary>

com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/AmbientDice.hlsl

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,6 @@ float ComputeZonalHarmonicC2FromAmbientDiceSharpness(float sharpness)
8080
return sharpness > 2.33 ? rhs : lhs;
8181
}
8282

83-
84-
// https://www.desmos.com/calculator/1ajnhdbg6j
85-
// Simple Least Squares Fit - raw data generated by directly projecting the ambient dice lobe to a zonal harmonic via integration.
86-
// Likely contains ringing for some sharpness levels.
87-
float ComputeZonalHarmonicC0FromAmbientDiceWrappedSharpness(float sharpness)
88-
{
89-
// sharpness abs is to simply make the compiler happy.
90-
return pow(abs(sharpness) * 0.816074 + 0.809515, -0.99663) * 2.87866 + -0.001;
91-
}
92-
93-
float ComputeZonalHarmonicC1FromAmbientDiceWrappedSharpness(float sharpness)
94-
{
95-
return exp2(-7.01231 * pow(abs(sharpness * 1.36435 + -1.3829), -0.786179)) * -1.14392 + 1.04683;
96-
}
97-
98-
float ComputeZonalHarmonicC2FromAmbientDiceWrappedSharpness(float sharpness)
99-
{
100-
float lhs = -0.438588 + 0.542959 * sharpness + -0.112098 * sharpness * sharpness + 0.00800693 * sharpness * sharpness * sharpness;
101-
float rhs = exp2(-6.39474 * pow(abs(sharpness * 0.488674 + -2.37692), -0.559034)) * -0.816382 + 0.473311;
102-
return sharpness > 5.0 ? rhs : lhs;
103-
}
104-
105-
10683
#else
10784
// https://www.desmos.com/calculator/umjtgtzmk8
10885
// Fit to pre-deringed data.
@@ -127,6 +104,27 @@ float ComputeZonalHarmonicC2FromAmbientDiceSharpness(float sharpness)
127104
}
128105
#endif
129106

107+
// https://www.desmos.com/calculator/1ajnhdbg6j
108+
// Simple Least Squares Fit - raw data generated by directly projecting the ambient dice lobe to a zonal harmonic via integration.
109+
// Likely contains ringing for some sharpness levels.
110+
float ComputeZonalHarmonicC0FromAmbientDiceWrappedSharpness(float sharpness)
111+
{
112+
// sharpness abs is to simply make the compiler happy.
113+
return pow(abs(sharpness) * 0.816074 + 0.809515, -0.99663) * 2.87866 + -0.001;
114+
}
115+
116+
float ComputeZonalHarmonicC1FromAmbientDiceWrappedSharpness(float sharpness)
117+
{
118+
return exp2(-7.01231 * pow(abs(sharpness * 1.36435 + -1.3829), -0.786179)) * -1.14392 + 1.04683;
119+
}
120+
121+
float ComputeZonalHarmonicC2FromAmbientDiceWrappedSharpness(float sharpness)
122+
{
123+
float lhs = -0.438588 + 0.542959 * sharpness + -0.112098 * sharpness * sharpness + 0.00800693 * sharpness * sharpness * sharpness;
124+
float rhs = exp2(-6.39474 * pow(abs(sharpness * 0.488674 + -2.37692), -0.559034)) * -0.816382 + 0.473311;
125+
return sharpness > 5.0 ? rhs : lhs;
126+
}
127+
130128
float3 ComputeZonalHarmonicFromAmbientDiceSharpness(float sharpness)
131129
{
132130
return float3(
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
Shader "Hidden/Debug/DebugDirtyFlags"
2+
{
3+
Properties
4+
{
5+
_ProbeVolumeResolution("_ProbeVolumeResolution", Vector) = (0, 0, 0, 0)
6+
_ProbeVolumeProbeDisplayRadiusWS("_ProbeVolumeProbeDisplayRadiusWS", Float) = 1.0
7+
}
8+
9+
SubShader
10+
{
11+
Tags{ "RenderPipeline" = "HDRenderPipeline" "RenderType" = "Opaque" "Queue" = "Transparent" }
12+
ZWrite On
13+
Cull Front
14+
15+
Pass
16+
{
17+
Name "ForwardUnlit"
18+
Tags{ "LightMode" = "Forward" }
19+
20+
HLSLPROGRAM
21+
22+
#pragma editor_sync_compilation
23+
24+
#pragma vertex vert
25+
#pragma fragment frag
26+
27+
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
28+
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
29+
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
30+
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl"
31+
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationGlobals.hlsl"
32+
33+
struct appdata
34+
{
35+
uint vertexID : SV_VertexID;
36+
};
37+
38+
struct v2f
39+
{
40+
float4 positionCS : SV_POSITION;
41+
float3 color : COLOR;
42+
float2 uv : TEXCOORD0;
43+
};
44+
45+
float3 _ProbeVolumeResolution;
46+
float4x4 _ProbeIndex3DToPositionWSMatrix;
47+
float _ProbeVolumeProbeDisplayRadiusWS;
48+
StructuredBuffer<int> _ProbeVolumeDirtyFlags;
49+
50+
uint3 ComputeWriteIndexFromReadIndex(uint readIndex, float3 resolution)
51+
{
52+
// _ProbeVolumeAtlasReadBuffer[z * resolutionY * resolutionX + y * resolutionX + x]
53+
// TODO: Could implement as floating point operations, which is likely faster.
54+
// Would need to verify precision.
55+
uint x = readIndex % (uint)resolution.x;
56+
uint y = (readIndex / (uint)resolution.x) % (uint)resolution.y;
57+
uint z = readIndex / ((uint)resolution.y * (uint)resolution.x);
58+
59+
return uint3(x, y, z);
60+
}
61+
62+
v2f vert(appdata v)
63+
{
64+
v2f o;
65+
66+
uint probeIndex1D = v.vertexID / 6u;
67+
uint probeTriangleIndex = (v.vertexID / 3u) & 1u;
68+
uint probeVertexIndex = v.vertexID - probeIndex1D * 6u - probeTriangleIndex * 3u;
69+
70+
bool dirty = IsProbeDirty(_ProbeVolumeDirtyFlags, probeIndex1D);
71+
72+
float2 vertexPositionOS = (probeTriangleIndex == 1u)
73+
? float2((probeVertexIndex & 1u), saturate(probeVertexIndex))
74+
: float2(saturate(probeVertexIndex), saturate((float)probeVertexIndex - 1.0));
75+
o.uv = vertexPositionOS;
76+
vertexPositionOS = vertexPositionOS * 2.0 - 1.0;
77+
vertexPositionOS *= _ProbeVolumeProbeDisplayRadiusWS;
78+
79+
float3 probeIndex3D = ComputeWriteIndexFromReadIndex(probeIndex1D, _ProbeVolumeResolution);
80+
float3 probeOriginWS = mul(_ProbeIndex3DToPositionWSMatrix, float4(probeIndex3D, 1.0)).xyz;
81+
float3 probeOriginRWS = GetCameraRelativePositionWS(probeOriginWS);
82+
83+
float3 cameraRightWS = mul(float4(1.0, 0.0, 0.0, 0.0), UNITY_MATRIX_V).xyz;
84+
float3 cameraUpWS = mul(float4(0.0, 1.0, 0.0, 0.0), UNITY_MATRIX_V).xyz;
85+
86+
float3 positionRWS = (cameraRightWS * vertexPositionOS.x + cameraUpWS * vertexPositionOS.y) + probeOriginRWS;
87+
88+
o.color = dirty ? float3(1, 0.5, 0) : float3(0.5, 0, 0);
89+
o.positionCS = TransformWorldToHClip(positionRWS);
90+
91+
return o;
92+
}
93+
94+
void ClipProbeSphere(float2 uv)
95+
{
96+
float2 positionProbeCard = uv * 2.0 - 1.0;
97+
clip(dot(positionProbeCard, positionProbeCard) < 1.0 ? 1.0 : -1.0);
98+
}
99+
100+
float4 frag(v2f i) : SV_Target
101+
{
102+
ClipProbeSphere(i.uv);
103+
return float4(i.color, 1.0);
104+
}
105+
106+
ENDHLSL
107+
}
108+
}
109+
}

com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/DebugDirtyFlags.shader.meta

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbeDynamicGI.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ public class ProbeDynamicGI : VolumeComponent
4949
[Tooltip("Advanced control to clear all dynamic GI buffers in the event lighting blows up when tuning")]
5050
public BoolParameter clear = new BoolParameter(false);
5151

52-
5352
[Serializable]
5453
public sealed class ProbeVolumeDynamicGIBasisParameter : VolumeParameter<ProbeVolumeDynamicGI.ProbeVolumeDynamicGIBasis>
5554
{

com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationAxes.compute

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#pragma multi_compile BASIS_PROPAGATION_OVERRIDE_NONE BASIS_PROPAGATION_OVERRIDE_SPHERICAL_GAUSSIAN BASIS_PROPAGATION_OVERRIDE_AMBIENT_DICE_WRAPPED_SOFTER BASIS_PROPAGATION_OVERRIDE_AMBIENT_DICE_WRAPPED_SUPER_SOFT BASIS_PROPAGATION_OVERRIDE_AMBIENT_DICE_WRAPPED_ULTRA_SOFT
1111
#pragma multi_compile _ RADIANCE_ENCODING_LOGLUV RADIANCE_ENCODING_HALFLUV RADIANCE_ENCODING_R11G11B10
1212
#pragma multi_compile PROBE_VOLUMES_ENCODING_SPHERICAL_HARMONICS_L1 PROBE_VOLUMES_ENCODING_SPHERICAL_HARMONICS_L2
13+
#pragma multi_compile _ DIRTY_FLAGS_DISABLED
1314

1415
#include "Packages/com.unity.render-pipelines.high-definition-config/Runtime/ShaderConfig.cs.hlsl"
1516
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
@@ -43,6 +44,11 @@ StructuredBuffer<NeighborAxisLookup> _SortedNeighborAxisLookups;
4344
StructuredBuffer<NeighborAxis> _ProbeVolumeNeighbors;
4445
int _ProbeVolumeNeighborsCount;
4546

47+
#ifndef DIRTY_FLAGS_DISABLED
48+
StructuredBuffer<int> _ProbeVolumeDirtyFlags;
49+
RWStructuredBuffer<int> _ProbeVolumeNextDirtyFlags;
50+
#endif
51+
4652
StructuredBuffer<RADIANCE> _HitRadianceCacheAxis;
4753
int _HitRadianceCacheAxisCount;
4854

@@ -231,7 +237,7 @@ float3 PropagateLightFromNeighborSHWithZHFit(SHIncomingIrradiance shIncomingIrra
231237
{
232238
float3 basisAxisHitDirectionWS = mul(neighborAxisLookup.neighborDirection, probeVolumeLtw);
233239
ZHWindow basisAxisHitZHWindow = ComputeZHWindowFromBasisAxisHit(basisAxisNeighborHit);
234-
SHIncomingIrradianceConvolveZHWindowWithoutDeltaFunction(shIncomingIrradiance, basisAxisHitZHWindow);
240+
SHIncomingIrradianceConvolveZHWindowWithoutDeltaFunctionInPlace(shIncomingIrradiance, basisAxisHitZHWindow);
235241
return ProbeVolumeEvaluateIncomingRadiance(shIncomingIrradiance, basisAxisHitDirectionWS) * hitWeight;
236242
}
237243

@@ -284,13 +290,21 @@ float3 PropagateLightFromNeighborSHWithMonteCarloNaiveProjection(SHIncomingIrrad
284290
return incomingHitRadiance;
285291
}
286292

293+
RADIANCE GetPreviousAxisRadiance(int index)
294+
{
295+
#if defined(PREVIOUS_RADIANCE_CACHE_INVALID)
296+
return ZeroRadiance();
297+
#else
298+
return _PreviousRadianceCacheAxis[index];
299+
#endif
300+
}
301+
287302
#define BASIS_FROM_SH_MODE_MONTE_CARLO_NAIVE_PROJECTION (0)
288303
#define BASIS_FROM_SH_MODE_SAMPLE_PEAKS (1)
289304
#define BASIS_FROM_SH_MODE_ZH_FIT (2)
290305

291-
// See note in ProbePropagationInitialize.compute.
292-
// Sample Peaks turns out to be better than ZH Fit in practice for our combination of basis and SH order.
293-
#define BASIS_FROM_SH_MODE BASIS_FROM_SH_MODE_SAMPLE_PEAKS
306+
// Our ZH Fit produces results that are closer to the monte carlo naive projection ground turth than the sample peaks approach does. Both approaches are reasonable however.
307+
#define BASIS_FROM_SH_MODE BASIS_FROM_SH_MODE_ZH_FIT
294308

295309
[numthreads(GROUP_SIZE, 1, 1)]
296310
void PropagateLight(uint3 id : SV_DispatchThreadID)
@@ -303,18 +317,21 @@ void PropagateLight(uint3 id : SV_DispatchThreadID)
303317

304318
uint3 probeCoordinate = ProbeIndexToProbeCoordinatesUint(probeIndex);
305319

320+
#ifndef DIRTY_FLAGS_DISABLED
321+
if (!IsProbeDirty(_ProbeVolumeDirtyFlags, probeIndex))
322+
{
323+
_RadianceCacheAxis[index] = GetPreviousAxisRadiance(index);
324+
return;
325+
}
326+
#endif
327+
306328
const float3x3 probeVolumeLtw = float3x3(_ProbeVolumeDGIBoundsRight, _ProbeVolumeDGIBoundsUp, cross(_ProbeVolumeDGIBoundsRight, _ProbeVolumeDGIBoundsUp));
307329
const float3 probePositionWS = ProbeCoordinatesToWorldPosition(probeCoordinate, probeVolumeLtw);
308330

309331
// Early out at far distances
310332
if (IsFarFromCamera(probePositionWS, _RangeInFrontOfCamera, _RangeBehindCamera))
311333
{
312-
#if defined(PREVIOUS_RADIANCE_CACHE_INVALID)
313-
_RadianceCacheAxis[index] = ZeroRadiance();
314-
#else
315-
_RadianceCacheAxis[index] = _PreviousRadianceCacheAxis[index];
316-
#endif
317-
334+
_RadianceCacheAxis[index] = GetPreviousAxisRadiance(index);
318335
return;
319336
}
320337

@@ -406,6 +423,32 @@ void PropagateLight(uint3 id : SV_DispatchThreadID)
406423
}
407424
}
408425

409-
_RadianceCacheAxis[index] = EncodeRadiance((incomingHitRadiance + incomingMissRadiance) * _PropagationContribution);
426+
const float3 radiance = (incomingHitRadiance + incomingMissRadiance) * _PropagationContribution;
427+
_RadianceCacheAxis[index] = EncodeRadiance(radiance);
428+
429+
#ifndef DIRTY_FLAGS_DISABLED
430+
if (!IsSimilarEqual(GetPreviousAxisRadiance(index), radiance))
431+
{
432+
for (int l = 0; l < PROPAGATION_AXIS_AMOUNT; ++l)
433+
{
434+
NeighborAxisLookup neighborAxisLookup = _SortedNeighborAxisLookups[neighborAxisIndexOffset + l];
435+
int i = neighborAxisLookup.index;
436+
437+
int3 offset = GetNeighborAxisOffset(i);
438+
// When we gathered radiance from neighbors in miss directions we were adding the offset,
439+
// but here we try to predict which probes will gather changes from us so we subtract.
440+
int3 neighborProbeCoordinate = probeCoordinate - offset;
441+
442+
if(neighborProbeCoordinate.x >= 0 && neighborProbeCoordinate.x < (int)_ProbeVolumeDGIResolutionX &&
443+
neighborProbeCoordinate.y >= 0 && neighborProbeCoordinate.y < (int)_ProbeVolumeDGIResolutionY &&
444+
neighborProbeCoordinate.z >= 0 && neighborProbeCoordinate.z < (int)_ProbeVolumeDGIResolutionZ)
445+
{
446+
uint neighborProbeIndex = ProbeCoordinateToIndex(neighborProbeCoordinate);
447+
SetProbeDirty(_ProbeVolumeNextDirtyFlags, neighborProbeIndex);
448+
}
449+
}
450+
}
451+
#endif
452+
410453
}
411454
}

com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationBasis.hlsl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,23 @@ float ComputeBasisAxisHitIntegral(BasisAxisHit basisAxisHit)
6767
return integral;
6868
}
6969

70+
float ComputeBasisAxisHitIntegralFromSharpness(BasisAxisHit basisAxisHit)
71+
{
72+
float integral = 0.0;
73+
74+
#if defined(BASIS_SPHERICAL_GAUSSIAN)
75+
integral = SGIntegralFromSharpness(basisAxisHit.sharpness);
76+
#elif defined(BASIS_SPHERICAL_GAUSSIAN_WINDOWED)
77+
integral = SGClampedCosineWindowIntegralFromSharpness(basisAxisHit.sharpness);
78+
#elif defined(BASIS_AMBIENT_DICE)
79+
integral = AmbientDiceIntegralFromSharpness(basisAxisHit.sharpness);
80+
#else
81+
#error "Undefined Probe Propagation Basis"
82+
#endif
83+
84+
return integral;
85+
}
86+
7087
BasisAxisHit ComputeBasisAxisHit(float3 axis, float sharpnessIn)
7188
{
7289
BasisAxisHit basisAxis;

com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationCombine.compute

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#pragma multi_compile BASIS_PROPAGATION_OVERRIDE_NONE BASIS_PROPAGATION_OVERRIDE_SPHERICAL_GAUSSIAN BASIS_PROPAGATION_OVERRIDE_AMBIENT_DICE_WRAPPED_SOFTER BASIS_PROPAGATION_OVERRIDE_AMBIENT_DICE_WRAPPED_SUPER_SOFT BASIS_PROPAGATION_OVERRIDE_AMBIENT_DICE_WRAPPED_ULTRA_SOFT
77
#pragma multi_compile _ RADIANCE_ENCODING_LOGLUV RADIANCE_ENCODING_HALFLUV RADIANCE_ENCODING_R11G11B10
88
#pragma multi_compile PROBE_VOLUMES_ENCODING_SPHERICAL_HARMONICS_L1 PROBE_VOLUMES_ENCODING_SPHERICAL_HARMONICS_L2
9+
#pragma multi_compile _ DIRTY_FLAGS_DISABLED
910

1011
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbeVolumeDynamicGI.hlsl"
1112
#include "Packages/com.unity.render-pipelines.high-definition-config/Runtime/ShaderConfig.cs.hlsl"
@@ -34,6 +35,10 @@ float3 _ProbeVolumeAtlasSHRotateForward;
3435
float3 _ProbeVolumeDGIBoundsRight;
3536
float3 _ProbeVolumeDGIBoundsUp;
3637

38+
#ifndef DIRTY_FLAGS_DISABLED
39+
RWStructuredBuffer<int> _ProbeVolumeDirtyFlags;
40+
#endif
41+
3742
StructuredBuffer<RADIANCE> _RadianceCacheAxis;
3843
int _RadianceCacheAxisCount;
3944
float _BakedLightingContribution;
@@ -320,6 +325,11 @@ void CombinePropagationAxis(uint3 id : SV_DispatchThreadID)
320325
const uint readIndex = id.x;
321326
if (readIndex < _ProbeVolumeAtlasReadBufferCount)
322327
{
328+
#ifndef DIRTY_FLAGS_DISABLED
329+
if (!IsProbeDirty(_ProbeVolumeDirtyFlags, readIndex))
330+
return;
331+
#endif
332+
323333
uint3 writeIndex = ComputeWriteIndexFromReadIndex(readIndex, _ProbeVolumeResolution);
324334
const float validity = ReadValidity(readIndex);
325335

0 commit comments

Comments
 (0)