Skip to content

Commit 71736eb

Browse files
AndrewSaraevUnitypastasfuture
authored andcommitted
Dynamic GI:
DGI per volume mixed lights (#79) * Added a per-volume property defining if mixed lights were baked for this volume. Add all lights to the light list and skip mixed lights in shaders when required. * Revert to the previous way of uncapping shadow distance when baking dynamic GI mixed lights. Fix two misc DynamicGI shader warnings. (#89)
1 parent 9a8fa5e commit 71736eb

15 files changed

+52
-35
lines changed

com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDGpuLightsBuilder.Jobs.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,7 @@ public static void ConvertLightToGPUFormat(
315315
lightData.hierarchicalVarianceScreenSpaceShadowsIndex = -1;
316316
lightData.isRayTracedContactShadow = 0.0f;
317317

318-
// TODO: only apply for real-time lights, but lightComponent.lightmapBakeType is not available outside in built players, Editor only...
319-
lightData.affectDynamicGI = lightRenderData.affectDynamicGI ? 1 : 0;
318+
lightData.mixedDynamicGI = lightRenderData.mixedDynamicGI ? 1 : 0;
320319

321320
var distanceToCamera = processedEntity.distanceToCamera;
322321
float shadowDistanceFade;
@@ -700,8 +699,8 @@ private void ConvertDirectionalLightToGPUFormat(
700699

701700
lightData.flareSize = Mathf.Max(lightRenderData.flareSize * Mathf.Deg2Rad, 5.960464478e-8f);
702701
lightData.flareFalloff = lightRenderData.flareFalloff;
703-
// TODO: only apply for real-time lights, but lightComponent.lightmapBakeType is not available outside in built players, Editor only...
704702
lightData.affectDynamicGI = lightRenderData.affectDynamicGI ? 1 : 0;
703+
lightData.mixedDynamicGI = lightRenderData.mixedDynamicGI ? 1 : 0;
705704
lightData.flareTint = (Vector3)(Vector4)lightRenderData.flareTint;
706705
lightData.surfaceTint = (Vector3)(Vector4)lightRenderData.surfaceTint;
707706

com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDProcessedVisibleLightsBuilder.Jobs.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ protected struct ProcessVisibleLightJob : IJobParallelFor
4747
public bool enableAreaLights;
4848
[ReadOnly]
4949
public bool enableDynamicGI;
50-
[ReadOnly]
51-
public bool dynamicGIUseRealtimeLights;
52-
[ReadOnly]
53-
public bool dynamicGIUseMixedLights;
5450
#if UNITY_EDITOR
5551
[ReadOnly]
5652
public bool dynamicGIPreparingMixedLights;
@@ -262,8 +258,12 @@ public void Execute(int index)
262258

263259
bool affectsDynamicGI =
264260
enableDynamicGI &&
265-
lightRenderData.affectDynamicGI &&
266-
(lightRenderData.mixedDynamicGI ? dynamicGIUseMixedLights : dynamicGIUseRealtimeLights);
261+
lightRenderData.affectDynamicGI;
262+
263+
#if UNITY_EDITOR
264+
if (dynamicGIPreparingMixedLights)
265+
affectsDynamicGI &= lightRenderData.mixedDynamicGI;
266+
#endif
267267

268268
if (enableRayTracing && !lightRenderData.includeForRayTracing)
269269
return;
@@ -394,8 +394,6 @@ public void StartProcessVisibleLightJob(
394394
pixelCount = hdCamera.actualWidth * hdCamera.actualHeight,
395395
enableAreaLights = ShaderConfig.s_AreaLights != 0,
396396
enableDynamicGI = processDynamicGI,
397-
dynamicGIUseRealtimeLights = dynamicGIMixedLightMode != ProbeVolumeDynamicGIMixedLightMode.MixedOnly,
398-
dynamicGIUseMixedLights = dynamicGIMixedLightMode == ProbeVolumeDynamicGIMixedLightMode.ForceRealtime,
399397
#if UNITY_EDITOR
400398
dynamicGIPreparingMixedLights = ProbeVolume.preparingMixedLights,
401399
#endif
@@ -430,14 +428,6 @@ public void StartProcessVisibleLightJob(
430428
shadowLightsDataIndices = m_ShadowLightsDataIndices
431429
};
432430

433-
#if UNITY_EDITOR
434-
if (ProbeVolume.preparingMixedLights)
435-
{
436-
processVisibleLightJob.dynamicGIUseRealtimeLights = false;
437-
processVisibleLightJob.dynamicGIUseMixedLights = true;
438-
}
439-
#endif
440-
441431
m_ProcessVisibleLightJobHandle = processVisibleLightJob.Schedule(m_Size, 32);
442432
}
443433

com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ struct DirectionalLightData
103103
public float distanceFromCamera; // -1 -> no sky interaction
104104
public float angularDiameter; // Units: radians
105105
public float flareFalloff;
106-
public float affectDynamicGI;
106+
public int affectDynamicGI;
107+
public int mixedDynamicGI;
107108

108109
public Vector3 flareTint;
109110
public float flareSize; // Units: radians
@@ -167,7 +168,7 @@ struct LightData
167168
public int contactShadowMask; // negative if unused (TODO: 16 bit)
168169
public float diffuseDimmer;
169170
public float specularDimmer;
170-
public int affectDynamicGI;
171+
public int mixedDynamicGI;
171172

172173
public float padding;
173174
public float isRayTracedContactShadow;

com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs.hlsl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ struct DirectionalLightData
7979
float distanceFromCamera;
8080
float angularDiameter;
8181
float flareFalloff;
82-
float affectDynamicGI;
82+
int affectDynamicGI;
83+
int mixedDynamicGI;
8384
float3 flareTint;
8485
float flareSize;
8586
float3 surfaceTint;
@@ -121,8 +122,8 @@ struct LightData
121122
int contactShadowMask;
122123
float diffuseDimmer;
123124
float specularDimmer;
124-
int affectDynamicGI;
125-
float2 padding;
125+
int mixedDynamicGI;
126+
float padding;
126127
float isRayTracedContactShadow;
127128
float boxLightSafeExtent;
128129
int hierarchicalVarianceScreenSpaceShadowsIndex;

com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,9 @@ internal int GetCurrentShadowCount()
15931593
void LightLoopUpdateCullingParameters(ref ScriptableCullingParameters cullingParams, HDCamera hdCamera)
15941594
{
15951595
#if UNITY_EDITOR
1596+
// TODO: Support dynamic GI mixed mode for directional lights.
1597+
// When baking mixed lights for dynamic GI we leave shadow distance not limited by settings.
1598+
// This doesn't work well for directional light shadows, so mixed mode is not really supported for them.
15961599
if (!ProbeVolume.preparingMixedLights)
15971600
#endif
15981601
{

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ float _IndirectScale;
3333
float _MaxAlbedo;
3434
float _BakedEmissionMultiplier;
3535
float _MixedLightingMultiplier;
36+
int _MixedLightsAsRealtimeEnabled;
3637
float _RayBias;
3738
float _InfiniteBounce;
3839
float _Sharpness;
@@ -71,6 +72,10 @@ float3 BiasLightPositionNearHit(float3 lightPosition, float3 hitPosition)
7172
return normalize(vec) * pushDistance;
7273
}
7374

75+
bool CheckMixedLight(bool mixedDynamicGI)
76+
{
77+
return _MixedLightsAsRealtimeEnabled || !mixedDynamicGI;
78+
}
7479

7580
float3 EvaluateDirectLightingAtHit(SurfaceHitData hit)
7681
{
@@ -81,8 +86,11 @@ float3 EvaluateDirectLightingAtHit(SurfaceHitData hit)
8186
for (uint puncLightIdx = 0; puncLightIdx < _DynamicGIPunctualLightCount; ++puncLightIdx)
8287
{
8388
light = _DynamicGILightDatas[puncLightIdx];
84-
light.positionRWS += BiasLightPositionNearHit(light.positionRWS, GetCameraRelativePositionWS(hit.position));
85-
directLighting += GetLightingForAxisPunctual(light, _IndirectScale, hit);
89+
if (CheckMixedLight(light.mixedDynamicGI))
90+
{
91+
light.positionRWS += BiasLightPositionNearHit(light.positionRWS, GetCameraRelativePositionWS(hit.position));
92+
directLighting += GetLightingForAxisPunctual(light, _IndirectScale, hit);
93+
}
8694
}
8795

8896
#if SUPPORTS_AREA_LIGHTS
@@ -91,7 +99,8 @@ float3 EvaluateDirectLightingAtHit(SurfaceHitData hit)
9199
for (uint areaLightIdx = (uint)_DynamicGIPunctualLightCount; areaLightIdx < (uint)lastAreaLightIndex; ++areaLightIdx)
92100
{
93101
light = _DynamicGILightDatas[areaLightIdx];
94-
directLighting += GetLightingForAxisArea(light, _IndirectScale, hit);
102+
if (CheckMixedLight(light.mixedDynamicGI))
103+
directLighting += GetLightingForAxisArea(light, _IndirectScale, hit);
95104
}
96105
#endif
97106

@@ -100,10 +109,8 @@ float3 EvaluateDirectLightingAtHit(SurfaceHitData hit)
100109
{
101110
DirectionalLightData dirData = _DirectionalLightDatas[dirLightIdx];
102111
// Only support the shadow casting one otherwise result is completely off.
103-
if (dirData.affectDynamicGI > 0.0f && _DirectionalShadowIndex == (int)dirLightIdx)
104-
{
112+
if (dirData.affectDynamicGI && CheckMixedLight(dirData.mixedDynamicGI) && _DirectionalShadowIndex == (int)dirLightIdx)
105113
directLighting += GetLightingForAxisDirectional(dirData, _IndirectScale * dirData.bounceIntensity, hit);
106-
}
107114
}
108115

109116
return directLighting;

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,9 @@ void DispatchPropagationHits(CommandBuffer cmd, ProbeVolumeHandle probeVolume, i
615615
// We bake raw unscaled lighting values so we could adjust mixed lights contribution
616616
// with Indirect Scale at runtime in the same way as runtime lights.
617617
cmd.SetComputeFloatParam(shader, "_IndirectScale", 1f);
618-
cmd.SetComputeFloatParam(shader, "_MixedLightingMultiplier", 0f);
619618
cmd.SetComputeFloatParam(shader, "_BakedEmissionMultiplier", 0f);
619+
cmd.SetComputeFloatParam(shader, "_MixedLightingMultiplier", 0f);
620+
cmd.SetComputeIntParam(shader, "_MixedLightsAsRealtimeEnabled", 1);
620621
infBounce = 0f;
621622

622623
cmd.SetComputeFloatParam(shader, "_RangeBehindCamera", float.MaxValue);
@@ -626,8 +627,12 @@ void DispatchPropagationHits(CommandBuffer cmd, ProbeVolumeHandle probeVolume, i
626627
#endif
627628
{
628629
cmd.SetComputeFloatParam(shader, "_IndirectScale", mixedLightMode != ProbeVolumeDynamicGIMixedLightMode.MixedOnly ? giSettings.indirectMultiplier.value : 0f);
629-
cmd.SetComputeFloatParam(shader, "_MixedLightingMultiplier", mixedLightMode != ProbeVolumeDynamicGIMixedLightMode.ForceRealtime ? giSettings.indirectMultiplier.value : 0f);
630630
cmd.SetComputeFloatParam(shader, "_BakedEmissionMultiplier", giSettings.bakedEmissionMultiplier.value);
631+
632+
var forceRealtime = mixedLightMode == ProbeVolumeDynamicGIMixedLightMode.ForceRealtime;
633+
cmd.SetComputeFloatParam(shader, "_MixedLightingMultiplier", !forceRealtime ? giSettings.indirectMultiplier.value : 0f);
634+
cmd.SetComputeIntParam(shader, "_MixedLightsAsRealtimeEnabled", forceRealtime || !probeVolume.DynamicGIMixedLightsBaked() ? 1 : 0);
635+
631636
infBounce = infiniteBounces ? giSettings.infiniteBounce.value : 0f;
632637

633638
cmd.SetComputeFloatParam(shader, "_RangeBehindCamera", giSettings.rangeBehindCamera.value);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ internal void ConstructNeighborData(Vector3[] probePositionsWS, Quaternion rotat
124124

125125
GeneratePackedNeighborData(neighborBakeDatas, ref probeVolumeAsset, in parameters, hits);
126126
ClearContent();
127+
128+
probeVolumeAsset.dynamicGIMixedLightsBaked = false;
127129
}
128130

129131
internal void DebugDrawNeighborhood(ProbeVolumeHandle probeVolume, Camera camera)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ VaryingsType VertMeshProcedural(uint vertexID, uint instanceID)
113113
case 1:
114114
color = UnpackEmission(neighborData.emission);
115115
break;
116+
default:
117+
color = 0.0;
118+
break;
116119
}
117120

118121
#ifdef VARYINGS_NEED_POSITION_WS

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ interface IProbeVolumeList
3333
int GetNeighborAxisLength(int i);
3434
void SetHitNeighborAxis(int i, ComputeBuffer buffer);
3535
void SetNeighborAxis(int i, ComputeBuffer buffer);
36+
bool DynamicGIMixedLightsBaked(int i);
3637

3738
#if UNITY_EDITOR
3839
public bool IsHiddenInScene(int i);

0 commit comments

Comments
 (0)