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
This commit is contained in:
2026-04-20 22:10:18 +08:00
parent cee65fcf40
commit db7f427112
6 changed files with 79 additions and 11 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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 =

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -139,6 +139,9 @@ namespace ProjectScripts
RenderPassEvent.RenderOpaques,
scenePhase =
SceneRenderPhase.Opaque,
overrideRenderQueueRange = true,
renderQueueRange =
RenderQueueRange.Opaque,
rendererListType =
RendererListType.Opaque
}