Skip to content

Commit 3210bae

Browse files
DGI smaller encoding (#96)
* Experiment with storing DGI hit emission and probe radiance with half-float precision. * Trying RGBM32 encoding for DGI propogation. * Moved DGI radiance encoding functions to separate from emission to quickly iterate with it without touching the baked emission data. * Use LogLUV encoding for DGI hit and probe radiance. * Added YCoCg encoding for DGI radiance for testing. * Faster and more precise LogLuv radiance encoding with lower range. * Added a radiance encoding setting to Probe Dynamic GI volume component to switch between RGB Float and LogLuv. * Fixed hit radiance decoding for different encodings when baking mixed lighting. * Moved the radiance encoding setting from the volume component to frame settings. * Dynamic GI: Added HalfLUV, and R11G11B10 encoding modes Co-authored-by: pastasfuture <[email protected]>
1 parent fc97df7 commit 3210bae

File tree

13 files changed

+491
-70
lines changed

13 files changed

+491
-70
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,13 @@ static void Drawer_SectionLightingSettings(SerializedFrameSettings serialized, E
362362
hasMixedValues: serialized.probeVolumeDynamicGIMixedLightMode.hasMultipleDifferentValues,
363363
overrideable: () => hdrpSettings.supportProbeVolume && hdrpSettings.supportProbeVolumeDynamicGI
364364
);
365+
area.AmmendInfo(FrameSettingsField.ProbeVolumeDynamicGIRadianceEncoding,
366+
overridedDefaultValue: ProbeVolumeDynamicGIRadianceEncoding.RGBFloat,
367+
customGetter: () => serialized.probeVolumeDynamicGIRadianceEncoding.GetEnumValue<ProbeVolumeDynamicGIRadianceEncoding>(),
368+
customSetter: v => serialized.probeVolumeDynamicGIRadianceEncoding.SetEnumValue((ProbeVolumeDynamicGIRadianceEncoding)v),
369+
hasMixedValues: serialized.probeVolumeDynamicGIRadianceEncoding.hasMultipleDifferentValues,
370+
overrideable: () => hdrpSettings.supportProbeVolume && hdrpSettings.supportProbeVolumeDynamicGI
371+
);
365372

366373
area.AmmendInfo(FrameSettingsField.Volumetrics, overrideable: () => hdrpSettings.supportVolumetrics);
367374
area.AmmendInfo(FrameSettingsField.ReprojectionForVolumetrics, overrideable: () => hdrpSettings.supportVolumetrics);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class SerializedFrameSettings
2323
public SerializedProperty probeVolumeDynamicGIPropagationQuality;
2424
public SerializedProperty probeVolumeDynamicGIMaxSimulationsPerFrame;
2525
public SerializedProperty probeVolumeDynamicGIMixedLightMode;
26+
public SerializedProperty probeVolumeDynamicGIRadianceEncoding;
2627
public SerializedProperty materialQuality;
2728

2829
public SerializedObject serializedObject => m_RootData.serializedObject;
@@ -106,6 +107,7 @@ public SerializedFrameSettings(SerializedProperty rootData, SerializedProperty r
106107
probeVolumeDynamicGIPropagationQuality = rootData.FindPropertyRelative("probeVolumeDynamicGIPropagationQuality");
107108
probeVolumeDynamicGIMaxSimulationsPerFrame = rootData.FindPropertyRelative("probeVolumeDynamicGIMaxSimulationsPerFrame");
108109
probeVolumeDynamicGIMixedLightMode = rootData.FindPropertyRelative("probeVolumeDynamicGIMixedLightMode");
110+
probeVolumeDynamicGIRadianceEncoding = rootData.FindPropertyRelative("probeVolumeDynamicGIRadianceEncoding");
109111
materialQuality = rootData.Find((FrameSettings s) => s.materialQuality);
110112
}
111113

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
int _ProbeVolumeProbeCount;
99

10-
RWStructuredBuffer<float3> _RadianceCacheAxis;
11-
StructuredBuffer<float3> _PreviousRadianceCacheAxis;
10+
RWStructuredBuffer<RADIANCE> _RadianceCacheAxis;
11+
StructuredBuffer<RADIANCE> _PreviousRadianceCacheAxis;
1212

1313
int _ProbeVolumeIndex;
1414
float _LeakMitigation;
@@ -23,7 +23,7 @@ bool IsFarFromCamera(float3 worldPosition, float rangeInFrontOfCamera, float ran
2323
float3 ReadPreviousPropagationAxis(uint probeIndex, uint axisIndex)
2424
{
2525
const uint index = axisIndex * _ProbeVolumeProbeCount + probeIndex;
26-
return _PreviousRadianceCacheAxis[index];
26+
return DecodeRadiance(_PreviousRadianceCacheAxis[index]);
2727
}
2828

2929
float InvalidScale(float probeValidity)

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
#pragma multi_compile _ SAMPLE_NEIGHBORS_DIRECTION_ONLY SAMPLE_NEIGHBORS_POSITION_AND_DIRECTION
2-
#pragma multi_compile _ PROPAGATION_AXIS_MOST PROPAGATION_AXIS_LEAST
3-
#pragma multi_compile _ PREVIOUS_RADIANCE_CACHE_INVALID
4-
51
#pragma kernel PropagateLight
62
#define GROUP_SIZE 64
73
// #pragma enable_d3d11_debug_symbols
84

5+
#pragma multi_compile _ SAMPLE_NEIGHBORS_DIRECTION_ONLY SAMPLE_NEIGHBORS_POSITION_AND_DIRECTION
6+
#pragma multi_compile _ PROPAGATION_AXIS_MOST PROPAGATION_AXIS_LEAST
7+
#pragma multi_compile _ PREVIOUS_RADIANCE_CACHE_INVALID
8+
99
#pragma multi_compile BASIS_SPHERICAL_GAUSSIAN BASIS_SPHERICAL_GAUSSIAN_WINDOWED BASIS_AMBIENT_DICE_SHARP BASIS_AMBIENT_DICE_SOFTER BASIS_AMBIENT_DICE_SUPER_SOFT BASIS_AMBIENT_DICE_ULTRA_SOFT
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
11-
11+
#pragma multi_compile _ RADIANCE_ENCODING_LOGLUV RADIANCE_ENCODING_HALFLUV RADIANCE_ENCODING_R11G11B10
1212

1313
#include "Packages/com.unity.render-pipelines.high-definition-config/Runtime/ShaderConfig.cs.hlsl"
1414
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
@@ -42,7 +42,7 @@ StructuredBuffer<NeighborAxisLookup> _SortedNeighborAxisLookups;
4242
StructuredBuffer<NeighborAxis> _ProbeVolumeNeighbors;
4343
int _ProbeVolumeNeighborsCount;
4444

45-
StructuredBuffer<float3> _HitRadianceCacheAxis;
45+
StructuredBuffer<RADIANCE> _HitRadianceCacheAxis;
4646
int _HitRadianceCacheAxisCount;
4747

4848
float _PropagationContribution;
@@ -239,7 +239,7 @@ void PropagateLight(uint3 id : SV_DispatchThreadID)
239239
if (IsFarFromCamera(probePositionWS, _RangeInFrontOfCamera, _RangeBehindCamera))
240240
{
241241
#if defined(PREVIOUS_RADIANCE_CACHE_INVALID)
242-
_RadianceCacheAxis[index] = 0;
242+
_RadianceCacheAxis[index] = ZeroRadiance();
243243
#else
244244
_RadianceCacheAxis[index] = _PreviousRadianceCacheAxis[index];
245245
#endif
@@ -287,7 +287,7 @@ void PropagateLight(uint3 id : SV_DispatchThreadID)
287287
{
288288
// Hit
289289
float weight = neighborAxisLookup.hitWeight * basisAxisNeighborHitIntegral;
290-
incomingHitRadiance += _HitRadianceCacheAxis[hitIndex] * weight;
290+
incomingHitRadiance += DecodeRadiance(_HitRadianceCacheAxis[hitIndex]) * weight;
291291
}
292292
else
293293
{
@@ -336,6 +336,6 @@ void PropagateLight(uint3 id : SV_DispatchThreadID)
336336
}
337337
}
338338

339-
_RadianceCacheAxis[index] = (incomingHitRadiance + incomingMissRadiance) * _PropagationContribution;
339+
_RadianceCacheAxis[index] = EncodeRadiance((incomingHitRadiance + incomingMissRadiance) * _PropagationContribution);
340340
}
341341
}

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
#define GROUP_SIZE 64
33
//#pragma enable_d3d11_debug_symbols
44

5+
#pragma multi_compile _ RADIANCE_ENCODING_LOGLUV RADIANCE_ENCODING_HALFLUV RADIANCE_ENCODING_R11G11B10
56

6-
RWStructuredBuffer<float3> _RadianceCacheAxis0;
7-
RWStructuredBuffer<float3> _RadianceCacheAxis1;
8-
RWStructuredBuffer<float3> _HitRadianceCacheAxis;
7+
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbeVolumeDynamicGI.hlsl"
8+
9+
RWStructuredBuffer<RADIANCE> _RadianceCacheAxis0;
10+
RWStructuredBuffer<RADIANCE> _RadianceCacheAxis1;
11+
RWStructuredBuffer<RADIANCE> _HitRadianceCacheAxis;
912
int _RadianceCacheAxisCount;
1013
int _HitRadianceCacheAxisCount;
1114

@@ -15,11 +18,11 @@ void ClearPreviousRadianceCache(uint3 id : SV_DispatchThreadID)
1518
const int axisIndex = id.x;
1619
if (axisIndex < _RadianceCacheAxisCount)
1720
{
18-
_RadianceCacheAxis0[axisIndex] = 0;
19-
_RadianceCacheAxis1[axisIndex] = 0;
21+
_RadianceCacheAxis0[axisIndex] = ZeroRadiance();
22+
_RadianceCacheAxis1[axisIndex] = ZeroRadiance();
2023
}
2124
if (axisIndex < _HitRadianceCacheAxisCount)
2225
{
23-
_HitRadianceCacheAxis[axisIndex] = 0;
26+
_HitRadianceCacheAxis[axisIndex] = ZeroRadiance();
2427
}
2528
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
#pragma kernel CombinePropagationAxis
2+
#define GROUP_SIZE 64
3+
//#pragma enable_d3d11_debug_symbols
4+
5+
#pragma multi_compile BASIS_SPHERICAL_GAUSSIAN BASIS_SPHERICAL_GAUSSIAN_WINDOWED BASIS_AMBIENT_DICE_SHARP BASIS_AMBIENT_DICE_SOFTER BASIS_AMBIENT_DICE_SUPER_SOFT BASIS_AMBIENT_DICE_ULTRA_SOFT
6+
#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
7+
#pragma multi_compile _ RADIANCE_ENCODING_LOGLUV RADIANCE_ENCODING_HALFLUV RADIANCE_ENCODING_R11G11B10
8+
9+
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbeVolumeDynamicGI.hlsl"
110
#include "Packages/com.unity.render-pipelines.high-definition-config/Runtime/ShaderConfig.cs.hlsl"
211
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl"
312
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonLighting.hlsl"
@@ -6,15 +15,6 @@
615
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbeVolumeSphericalHarmonicsLighting.hlsl"
716
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationBasis.hlsl"
817

9-
#pragma kernel CombinePropagationAxis
10-
11-
#pragma multi_compile BASIS_SPHERICAL_GAUSSIAN BASIS_SPHERICAL_GAUSSIAN_WINDOWED BASIS_AMBIENT_DICE_SHARP BASIS_AMBIENT_DICE_SOFTER BASIS_AMBIENT_DICE_SUPER_SOFT BASIS_AMBIENT_DICE_ULTRA_SOFT
12-
#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
13-
14-
#define GROUP_SIZE 64
15-
//#pragma enable_d3d11_debug_symbols
16-
17-
1818
StructuredBuffer<float> _ProbeVolumeAtlasReadSHL01Buffer;
1919
StructuredBuffer<float> _ProbeVolumeAtlasReadSHL2Buffer;
2020
StructuredBuffer<float> _ProbeVolumeAtlasReadValidityBuffer;
@@ -31,7 +31,7 @@ float3 _ProbeVolumeAtlasSHRotateForward;
3131
float3 _ProbeVolumeDGIBoundsRight;
3232
float3 _ProbeVolumeDGIBoundsUp;
3333

34-
StructuredBuffer<float3> _RadianceCacheAxis;
34+
StructuredBuffer<RADIANCE> _RadianceCacheAxis;
3535
int _RadianceCacheAxisCount;
3636
float _BakedLightingContribution;
3737
float _DynamicPropagationContribution;
@@ -142,7 +142,7 @@ SHIncomingIrradiance ProjectPropagationAxisFromFit(uint probeIndex)
142142
uint localIndex = probeIndex;
143143
for (int axis = 0; axis < NEIGHBOR_AXIS_COUNT; ++axis)
144144
{
145-
float3 radiance = _RadianceCacheAxis[localIndex].xyz;
145+
float3 radiance = DecodeRadiance(_RadianceCacheAxis[localIndex]);
146146
float3 directionOS = _RayAxis[axis].xyz;
147147
const float3x3 probeVolumeLtw = float3x3(_ProbeVolumeDGIBoundsRight, _ProbeVolumeDGIBoundsUp, cross(_ProbeVolumeDGIBoundsRight, _ProbeVolumeDGIBoundsUp));
148148
float3 directionWS = mul(directionOS, probeVolumeLtw);

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
#pragma multi_compile _ COMPUTE_INFINITE_BOUNCE
2-
#pragma multi_compile _ PREVIOUS_RADIANCE_CACHE_INVALID
3-
41
#pragma kernel AccumulateLightingDirectional
52
#define GROUP_SIZE 64
63
//#pragma enable_d3d11_debug_symbols
74

5+
#pragma multi_compile _ COMPUTE_INFINITE_BOUNCE
6+
#pragma multi_compile _ PREVIOUS_RADIANCE_CACHE_INVALID
7+
88
#pragma multi_compile BASIS_SPHERICAL_GAUSSIAN BASIS_SPHERICAL_GAUSSIAN_WINDOWED BASIS_AMBIENT_DICE_SHARP BASIS_AMBIENT_DICE_SOFTER BASIS_AMBIENT_DICE_SUPER_SOFT BASIS_AMBIENT_DICE_ULTRA_SOFT
99
#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
10+
#pragma multi_compile _ RADIANCE_ENCODING_LOGLUV RADIANCE_ENCODING_HALFLUV RADIANCE_ENCODING_R11G11B10
1011

1112
#define SHADOW_MINIMAL
1213
#define LIGHT_EVALUATION_NO_HEIGHT_FOG
@@ -21,7 +22,7 @@
2122
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationLighting.hlsl"
2223
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/DynamicGI/ProbePropagationBasis.hlsl"
2324

24-
RWStructuredBuffer<float3> _HitRadianceCacheAxis;
25+
RWStructuredBuffer<RADIANCE> _HitRadianceCacheAxis;
2526
int _HitRadianceCacheAxisCount;
2627

2728
StructuredBuffer<PackedNeighborHit> _ProbeVolumeNeighborHits;
@@ -223,6 +224,6 @@ void AccumulateLightingDirectional(uint3 id : SV_DispatchThreadID)
223224
lighting += UnpackEmission(neighborData.emission) * _BakedEmissionMultiplier;
224225
lighting += UnpackEmission(neighborData.mixedLighting) * _MixedLightingMultiplier;
225226

226-
_HitRadianceCacheAxis[hitAxisIndex] = lighting;
227+
_HitRadianceCacheAxis[hitAxisIndex] = EncodeRadiance(lighting);
227228
}
228229
}

0 commit comments

Comments
 (0)