Skip to content

Commit e5a19d6

Browse files
laylaarabEvergreen
authored andcommitted
Fix Surface Cache emission to work with materials set to Realtime GI
1 parent feb8f7a commit e5a19d6

File tree

6 files changed

+43
-15
lines changed

6 files changed

+43
-15
lines changed

Packages/com.unity.render-pipelines.core/Runtime/PathTracing/MaterialPool/MaterialAspectOracle.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ internal struct MaterialPropertyDesc
1212
public float3 Color; // Unused if type == Textured
1313
}
1414

15+
internal enum EmissionMode
16+
{
17+
Baked,
18+
Realtime
19+
}
20+
1521
internal enum TransmissionChannels { None = 0, RGB, Alpha }
1622

1723
internal struct TransmissionDesc
@@ -25,13 +31,35 @@ internal struct TransmissionDesc
2531
internal static class MaterialAspectOracle
2632
{
2733
// See gi::HasBakedEmissive in Materials.cpp
28-
public static MaterialPropertyDesc GetEmission(Material mat)
34+
public static MaterialPropertyDesc GetEmission(Material mat, EmissionMode emissionMode)
2935
{
30-
// If the material is not marked as baked emissive, or if it is black, there is no emission
3136
var emissiveFlags = mat.globalIlluminationFlags;
37+
38+
// If the material is explicitly marked as black, there is no emission
3239
bool isBlack = emissiveFlags.HasFlag(MaterialGlobalIlluminationFlags.EmissiveIsBlack);
40+
if (isBlack)
41+
{
42+
return new MaterialPropertyDesc { Type = MaterialPropertyType.None, Color = float3.zero };
43+
}
44+
3345
bool isBaked = emissiveFlags.HasFlag(MaterialGlobalIlluminationFlags.BakedEmissive);
34-
if (isBlack || !isBaked)
46+
bool isRealtime = emissiveFlags.HasFlag(MaterialGlobalIlluminationFlags.RealtimeEmissive);
47+
48+
bool emissionEnabled = false;
49+
switch (emissionMode)
50+
{
51+
case EmissionMode.Baked:
52+
emissionEnabled = isBaked;
53+
break;
54+
case EmissionMode.Realtime:
55+
emissionEnabled = isRealtime;
56+
break;
57+
default:
58+
Debug.LogError($"Unexpected emission mode: {emissionMode}");
59+
break;
60+
}
61+
62+
if (!emissionEnabled)
3563
{
3664
return new MaterialPropertyDesc { Type = MaterialPropertyType.None, Color = float3.zero };
3765
}
@@ -151,7 +179,7 @@ public static float GetAlpha(Material mat)
151179
return mat.GetColor(mat.shader.GetPropertyNameId(i)).a;
152180
}
153181
}
154-
182+
155183
return 1.0f;
156184
}
157185
}

Packages/com.unity.render-pipelines.core/Runtime/PathTracing/MaterialPool/MaterialPool.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,12 +653,12 @@ private static Texture EvaluateMetaPass(Material material, TextureType textureTy
653653
}
654654

655655
// The textures referenced by the material descriptor are owned by the material descriptor.
656-
public static MaterialPool.MaterialDescriptor ConvertUnityMaterialToMaterialDescriptor(Material material)
656+
public static MaterialPool.MaterialDescriptor ConvertUnityMaterialToMaterialDescriptor(Material material, EmissionMode emissionMode)
657657
{
658658
MaterialPool.MaterialDescriptor descriptor = new();
659659

660660
// Emission
661-
var emission = MaterialAspectOracle.GetEmission(material);
661+
var emission = MaterialAspectOracle.GetEmission(material, emissionMode);
662662
descriptor.EmissionType = emission.Type;
663663
descriptor.EmissionColor = emission.Color;
664664
if (emission.Type == MaterialPropertyType.Texture)

Packages/com.unity.render-pipelines.core/Runtime/PathTracing/PathTracingContext.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ internal RayTracingBackend SelectRayTracingBackend(RayTracingBackend requestedBa
158158
worldResources.LoadFromAssetDatabase();
159159
#endif
160160
_world.Init(_rayTracingContext, worldResources);
161-
_defaultMaterialDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(_defaultMaterial);
161+
_defaultMaterialDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(_defaultMaterial, EmissionMode.Baked);
162162
var defaultHandle = _world.AddMaterial(in _defaultMaterialDescriptor, UVChannel.UV0);
163163
_instanceIDToWorldMaterialHandles.Add(_defaultMaterial.GetEntityId(), defaultHandle);
164164
_instanceIDToWorldMaterialDescriptors.Add(_defaultMaterial.GetEntityId(), _defaultMaterialDescriptor);
@@ -353,7 +353,7 @@ static void DeleteTemporaryTextures(ref MaterialPool.MaterialDescriptor desc)
353353
foreach (var material in addedMaterials)
354354
{
355355
// Add material to the world
356-
var descriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material);
356+
var descriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material, EmissionMode.Baked);
357357
var handle = world.AddMaterial(in descriptor, UVChannel.UV0);
358358
instanceIDToHandle.Add(material.GetEntityId(), handle);
359359

@@ -370,7 +370,7 @@ static void DeleteTemporaryTextures(ref MaterialPool.MaterialDescriptor desc)
370370

371371
// Update the material in the world using the new descriptor
372372
Debug.Assert(instanceIDToHandle.ContainsKey(material.GetEntityId()));
373-
var newDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material);
373+
var newDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material, EmissionMode.Baked);
374374
world.UpdateMaterial(instanceIDToHandle[material.GetEntityId()], in newDescriptor, UVChannel.UV0);
375375
instanceIDToDescriptor[material.GetEntityId()] = newDescriptor;
376376
}

Packages/com.unity.render-pipelines.core/Tests/Editor/PathTracing/WorldTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void Setup()
5050
var worldResources = new WorldResourceSet();
5151
worldResources.LoadFromAssetDatabase();
5252
_world.Init(_rayTracingContext, worldResources);
53-
_world.AddMaterial(MaterialPool.ConvertUnityMaterialToMaterialDescriptor(_defaultMaterial), UVChannel.UV0);
53+
_world.AddMaterial(MaterialPool.ConvertUnityMaterialToMaterialDescriptor(_defaultMaterial, EmissionMode.Baked), UVChannel.UV0);
5454

5555
_samplingResources = new SamplingResources();
5656
_samplingResources.Load((uint)SamplingResources.ResourceType.All);
@@ -128,7 +128,7 @@ InstanceHandle AddInstanceToWorld(Mesh mesh, Matrix4x4 localToWorld, Material ma
128128
const bool isStatic = true;
129129
uint objectLayerMask = 1;
130130
bool enableEmissiveSampling = true;
131-
var materialHandle = _world.AddMaterial(MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material), UVChannel.UV0);
131+
var materialHandle = _world.AddMaterial(MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material, EmissionMode.Baked), UVChannel.UV0);
132132
var mask = World.GetInstanceMask(ShadowCastingMode.On, isStatic, RenderedGameObjectsFilter.OnlyStatic);
133133

134134
return _world.AddInstance(mesh, new MaterialHandle[] { materialHandle }, new uint[] { mask }, objectLayerMask, localToWorld, bounds, isStatic, RenderedGameObjectsFilter.OnlyStatic, enableEmissiveSampling);

Packages/com.unity.render-pipelines.core/Tests/Runtime/PathTracing/PathIteratorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public void RayHittingPlaneLitByWhiteEnvironmentLight_ShouldMatchAnalyticDerivat
188188
var material = new Material(Shader.Find("PathIteratorTesting/UniformAlbedoMetaPass"));
189189
material.SetColor("_Albedo", new Color(albedoRed, albedoGreen, albedoBlue, 1));
190190

191-
var matDesc = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material);
191+
var matDesc = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material, EmissionMode.Baked);
192192

193193
_world.SetEnvironmentMaterial(cubemapMaterial);
194194
var matHandle = _world.AddMaterial(matDesc, UVChannel.UV0);

Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/SurfaceCacheGIRendererFeature/SurfaceCacheWorldAdapter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private class TerrainRebuild
4646
public SurfaceCacheWorldAdapter(SurfaceCacheWorld world, Material fallbackMaterial)
4747
{
4848
_fallbackMaterial = fallbackMaterial;
49-
_fallbackMaterialDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(fallbackMaterial);
49+
_fallbackMaterialDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(fallbackMaterial, EmissionMode.Realtime);
5050
_fallbackMaterialHandle = world.AddMaterial(in _fallbackMaterialDescriptor, UVChannel.UV0);
5151
_entityIDToWorldMaterialHandles.Add(fallbackMaterial.GetEntityId(), _fallbackMaterialHandle);
5252
_entityIDToWorldMaterialDescriptors.Add(fallbackMaterial.GetEntityId(), _fallbackMaterialDescriptor);
@@ -123,7 +123,7 @@ static void DeleteTemporaryTextures(ref MaterialPool.MaterialDescriptor desc)
123123
foreach (var material in addedMaterials)
124124
{
125125
// Add material to the world
126-
var descriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material);
126+
var descriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material, EmissionMode.Realtime);
127127
var handle = world.AddMaterial(in descriptor, UVChannel.UV0);
128128
entityIDToHandle.Add(material.GetEntityId(), handle);
129129

@@ -140,7 +140,7 @@ static void DeleteTemporaryTextures(ref MaterialPool.MaterialDescriptor desc)
140140

141141
// Update the material in the world using the new descriptor
142142
Debug.Assert(entityIDToHandle.ContainsKey(material.GetEntityId()));
143-
var newDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material);
143+
var newDescriptor = MaterialPool.ConvertUnityMaterialToMaterialDescriptor(material, EmissionMode.Realtime);
144144
world.UpdateMaterial(entityIDToHandle[material.GetEntityId()], in newDescriptor, UVChannel.UV0);
145145
entityIDToDescriptor[material.GetEntityId()] = newDescriptor;
146146
}

0 commit comments

Comments
 (0)