diff --git a/com.unity.render-pipelines.core/Runtime/BatchRenderer/RenderBRG.cs b/com.unity.render-pipelines.core/Runtime/BatchRenderer/RenderBRG.cs index cd2af13ba8e..5fc014f28b7 100644 --- a/com.unity.render-pipelines.core/Runtime/BatchRenderer/RenderBRG.cs +++ b/com.unity.render-pipelines.core/Runtime/BatchRenderer/RenderBRG.cs @@ -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, @@ -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 @@ -876,8 +878,6 @@ public void Initialize(List renderers, GeometryPool geometryPool) m_AddedRenderers = new List(renderers.Count); m_GlobalGeoPool = geometryPool; - RenderPipelineAsset renderPipelineAsset = GraphicsSettings.renderPipelineAsset; - // Fill the GPU-persistent scene data ComputeBuffer int bigDataBufferVector4Count = 4 /*zero*/ @@ -942,6 +942,8 @@ public void Initialize(List 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]; @@ -1016,7 +1018,7 @@ public void Initialize(List renderers, GeometryPool geometryPool) var usedSubmeshIndices = new List(); var usedMaterials = new List(); ProcessUsedMeshAndMaterialDataFromGameObjects( - renderPipelineAsset, i, renderer, meshFilter, rendererMaterialInfos, + activePipeline, onGetMaterialInfoCb, i, renderer, meshFilter, rendererMaterialInfos, deferredMaterialDataOffset, vectorBuffer, ref usedMesh, usedSubmeshIndices, usedMaterials); @@ -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 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 m_Scenes = new(); private CommandBuffer m_gpuCmdBuffer; diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs index 9ef3b8dd961..9c1a86395ac 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs @@ -18,6 +18,7 @@ public partial class HDRenderPipelineAsset : RenderPipelineAsset, IVirtualTextur HDRenderPipelineAsset() { + RenderBRG.RegisterSRPRenderInfoCallback(this, GetMaterialInfoForBRG); } void Reset() @@ -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