From db7f427112b39c7f3331c8e8cda7a0fd836e60be Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Mon, 20 Apr 2026 22:10:18 +0800 Subject: [PATCH] feat(srp): add render queue range authoring - add a core RenderQueueRange helper for managed scene draw filtering - let FilteringSettings and RenderObjectsRendererFeature consume queue ranges directly - wire the new authoring path into probes and project-side usage --- managed/CMakeLists.txt | 1 + .../ScriptableRenderContextApiSurfaceProbe.cs | 4 ++ .../Universal/RenderObjectsRendererFeature.cs | 9 +++++ .../Rendering/Core/FilteringSettings.cs | 40 ++++++++++++++----- .../Rendering/Core/RenderQueueRange.cs | 33 +++++++++++++++ .../Scripts/ProjectRenderPipelineProbe.cs | 3 ++ 6 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 managed/XCEngine.ScriptCore/Rendering/Core/RenderQueueRange.cs diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index 49e6ee22..c4a889fa 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -180,6 +180,7 @@ set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/GraphicsSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderPipelineAsset.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderQueueRange.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RendererListDesc.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RendererListType.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RendererSortMode.cs diff --git a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs index e153711e..eab0c2a6 100644 --- a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs +++ b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs @@ -66,6 +66,7 @@ namespace Gameplay public bool HasSceneRenderPhaseType; public bool HasSceneRenderInjectionPointType; public bool HasRendererListType; + public bool HasRenderQueueRangeType; public bool HasRendererSortModeType; public bool HasFilteringSettingsType; public bool HasSortingSettingsType; @@ -352,6 +353,9 @@ namespace Gameplay HasRendererListType = contextType.Assembly.GetType( "XCEngine.Rendering.RendererListType") != null; + HasRenderQueueRangeType = + contextType.Assembly.GetType( + "XCEngine.Rendering.RenderQueueRange") != null; HasRendererSortModeType = contextType.Assembly.GetType( "XCEngine.Rendering.RendererSortMode") != null; diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs index 4208683a..f4954f1c 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs @@ -14,6 +14,9 @@ namespace XCEngine.Rendering.Universal SceneRenderPhase.Opaque; public RendererListType rendererListType = RendererListType.Opaque; + public bool overrideRenderQueueRange; + public RenderQueueRange renderQueueRange = + RenderQueueRange.Opaque; public bool overrideFilteringSettings; public FilteringSettings filteringSettings; public bool overrideSortingSettings; @@ -73,6 +76,12 @@ namespace XCEngine.Rendering.Universal filteringSettings; } + if (overrideRenderQueueRange) + { + rendererListDesc.filtering.renderQueueRange = + renderQueueRange; + } + if (overrideSortingSettings) { rendererListDesc.sorting = diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs b/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs index 5714c071..60f852a1 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs @@ -5,8 +5,6 @@ namespace XCEngine.Rendering [StructLayout(LayoutKind.Sequential)] public struct FilteringSettings { - private const int kTransparentRenderQueue = 3000; - public int renderQueueMin; public int renderQueueMax; @@ -16,24 +14,44 @@ namespace XCEngine.Rendering [MarshalAs(UnmanagedType.I1)] public bool requireRenderObjectId; + public RenderQueueRange renderQueueRange + { + get + { + return new RenderQueueRange( + renderQueueMin, + renderQueueMax); + } + set + { + renderQueueMin = value.lowerBound; + renderQueueMax = value.upperBound; + } + } + + public static FilteringSettings Create( + RenderQueueRange renderQueueRange) + { + return new FilteringSettings + { + renderQueueRange = renderQueueRange + }; + } + public static FilteringSettings CreateDefault( RendererListType rendererListType) { FilteringSettings filteringSettings = - new FilteringSettings - { - renderQueueMin = int.MinValue, - renderQueueMax = int.MaxValue - }; + Create(RenderQueueRange.All); switch (rendererListType) { case RendererListType.Opaque: - filteringSettings.renderQueueMax = - kTransparentRenderQueue - 1; + filteringSettings.renderQueueRange = + RenderQueueRange.Opaque; break; case RendererListType.Transparent: - filteringSettings.renderQueueMin = - kTransparentRenderQueue; + filteringSettings.renderQueueRange = + RenderQueueRange.Transparent; break; case RendererListType.ShadowCaster: filteringSettings.requireShadowCasting = true; diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/RenderQueueRange.cs b/managed/XCEngine.ScriptCore/Rendering/Core/RenderQueueRange.cs new file mode 100644 index 00000000..3744572f --- /dev/null +++ b/managed/XCEngine.ScriptCore/Rendering/Core/RenderQueueRange.cs @@ -0,0 +1,33 @@ +namespace XCEngine.Rendering +{ + public struct RenderQueueRange + { + private const int kTransparentRenderQueue = 3000; + + public int lowerBound; + public int upperBound; + + public RenderQueueRange( + int lowerBound, + int upperBound) + { + this.lowerBound = lowerBound; + this.upperBound = upperBound; + } + + public static RenderQueueRange All => + new RenderQueueRange( + int.MinValue, + int.MaxValue); + + public static RenderQueueRange Opaque => + new RenderQueueRange( + int.MinValue, + kTransparentRenderQueue - 1); + + public static RenderQueueRange Transparent => + new RenderQueueRange( + kTransparentRenderQueue, + int.MaxValue); + } +} diff --git a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs index 267a3f48..ffbae9ea 100644 --- a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs +++ b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs @@ -139,6 +139,9 @@ namespace ProjectScripts RenderPassEvent.RenderOpaques, scenePhase = SceneRenderPhase.Opaque, + overrideRenderQueueRange = true, + renderQueueRange = + RenderQueueRange.Opaque, rendererListType = RendererListType.Opaque }