Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 43 additions & 6 deletions com.unity.render-pipelines.core/Runtime/BatchRenderer/RenderBRG.cs
Original file line number Diff line number Diff line change
Expand Up @@ -755,7 +755,8 @@ public JobHandle OnPerformCulling(BatchRendererGroup rendererGroup, BatchCulling
}

private void ProcessUsedMeshAndMaterialDataFromGameObjects(
RenderPipelineAsset pipelineAsset,
RenderPipelineAsset activePipelineAsset,
RenderBRGGetMaterialRenderInfoCallback onGetMaterialInfoCb,
int instanceIndex,
MeshRenderer renderer,
MeshFilter meshFilter,
Expand All @@ -781,10 +782,11 @@ private void ProcessUsedMeshAndMaterialDataFromGameObjects(
matToUse = sharedMaterials[matIndex];

int targetSubmeshIndex = (int)(startSubMesh + matIndex);
if (pipelineAsset != null)
if (onGetMaterialInfoCb != null)
{
RenderPipelineAsset.VisibilityMaterialRendererInfo visMaterialInfo = pipelineAsset.GetVisibilityMaterialInfoForRenderer(new RenderPipelineAsset.GetVisibilityMaterialInfoForRendererArgs()
RenderBRGMaterialRenderInfo visMaterialInfo = onGetMaterialInfoCb(new RenderBRGGetMaterialRenderInfoArgs()
{
pipelineAsset = activePipelineAsset,
renderer = renderer,
submeshIndex = targetSubmeshIndex,
material = matToUse
Expand Down Expand Up @@ -876,8 +878,6 @@ public void Initialize(List<MeshRenderer> renderers, GeometryPool geometryPool)
m_AddedRenderers = new List<MeshRenderer>(renderers.Count);
m_GlobalGeoPool = geometryPool;

RenderPipelineAsset renderPipelineAsset = GraphicsSettings.renderPipelineAsset;

// Fill the GPU-persistent scene data ComputeBuffer
int bigDataBufferVector4Count =
4 /*zero*/
Expand Down Expand Up @@ -942,6 +942,8 @@ public void Initialize(List<MeshRenderer> renderers, GeometryPool geometryPool)
bool useFirstMeshForAll = false; // Hack to help benchmarking different bottlenecks. TODO: Remove!
MeshFilter firstMesh = null;

RenderBRGGetMaterialRenderInfoCallback onGetMaterialInfoCb = RenderBRG.GetActiveMaterialRenderInfoCallback(out RenderPipelineAsset activePipeline);

for (int i = 0; i < renderers.Count; i++)
{
var renderer = renderers[i];
Expand Down Expand Up @@ -1016,7 +1018,7 @@ public void Initialize(List<MeshRenderer> renderers, GeometryPool geometryPool)
var usedSubmeshIndices = new List<int>();
var usedMaterials = new List<Material>();
ProcessUsedMeshAndMaterialDataFromGameObjects(
renderPipelineAsset, i, renderer, meshFilter, rendererMaterialInfos,
activePipeline, onGetMaterialInfoCb, i, renderer, meshFilter, rendererMaterialInfos,
deferredMaterialDataOffset, vectorBuffer,
ref usedMesh, usedSubmeshIndices, usedMaterials);

Expand Down Expand Up @@ -1260,8 +1262,43 @@ public void Destroy()
}
}

public struct RenderBRGMaterialRenderInfo
{
public bool supportsVisibility;
public Material materialOverride;
}

public struct RenderBRGGetMaterialRenderInfoArgs
{
public RenderPipelineAsset pipelineAsset;
public Renderer renderer;
public int submeshIndex;
public Material material;
}

public delegate RenderBRGMaterialRenderInfo RenderBRGGetMaterialRenderInfoCallback(RenderBRGGetMaterialRenderInfoArgs arguments);

public class RenderBRG : MonoBehaviour
{
private static Dictionary<Guid, RenderBRGGetMaterialRenderInfoCallback> s_SrpMatInfoCallbacks = new();

public static void RegisterSRPRenderInfoCallback(RenderPipelineAsset pipelineAsset, RenderBRGGetMaterialRenderInfoCallback callbackValue)
{
s_SrpMatInfoCallbacks[pipelineAsset.GetType().GUID] = callbackValue;
}

internal static RenderBRGGetMaterialRenderInfoCallback GetActiveMaterialRenderInfoCallback(out RenderPipelineAsset activePipeline)
{
activePipeline = GraphicsSettings.renderPipelineAsset;
if (activePipeline == null)
return null;

if (s_SrpMatInfoCallbacks.TryGetValue(activePipeline.GetType().GUID, out var outCallback))
return outCallback;

return null;
}

private static bool s_QueryLoadedScenes = true;
private Dictionary<Scene, SceneBRG> m_Scenes = new();
private CommandBuffer m_gpuCmdBuffer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public partial class HDRenderPipelineAsset : RenderPipelineAsset, IVirtualTextur

HDRenderPipelineAsset()
{
RenderBRG.RegisterSRPRenderInfoCallback(this, GetMaterialInfoForBRG);
}

void Reset()
Expand Down Expand Up @@ -226,12 +227,12 @@ bool UpdateDefineList(bool flagValue, string defineMacroValue)
private static Material s_VisibilityMaterial = null;
public Material VisibilityMaterial { get { return s_VisibilityMaterial; } }

public override RenderPipelineAsset.VisibilityMaterialRendererInfo GetVisibilityMaterialInfoForRenderer(RenderPipelineAsset.GetVisibilityMaterialInfoForRendererArgs arguments)
public RenderBRGMaterialRenderInfo GetMaterialInfoForBRG(RenderBRGGetMaterialRenderInfoArgs arguments)
{
if (s_VisibilityMaterial == null)
s_VisibilityMaterial = CoreUtils.CreateEngineMaterial(globalSettings.renderPipelineResources.shaders.visibilityPS);

return new RenderPipelineAsset.VisibilityMaterialRendererInfo()
return new RenderBRGMaterialRenderInfo()
{
supportsVisibility = true,
materialOverride = s_VisibilityMaterial
Expand Down