feat(srp): add descriptor-driven object draw authoring

- bridge renderer list descriptors into ScriptableRenderContext scene draw calls
- reuse DrawObjectsPass across Universal and project custom renderers
- add RenderObjectsRendererFeature for package-level object draw extension
This commit is contained in:
2026-04-20 22:05:38 +08:00
parent 3df87e941c
commit cee65fcf40
18 changed files with 493 additions and 73 deletions

View File

@@ -778,10 +778,10 @@ namespace XCEngine
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderContext_DrawRenderers(
Rendering_ScriptableRenderContext_DrawRenderersByDesc(
ulong nativeHandle,
int scenePhase,
int rendererListType);
ref Rendering.RendererListDesc rendererListDesc);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool

View File

@@ -0,0 +1,49 @@
using System.Runtime.InteropServices;
namespace XCEngine.Rendering
{
[StructLayout(LayoutKind.Sequential)]
public struct FilteringSettings
{
private const int kTransparentRenderQueue = 3000;
public int renderQueueMin;
public int renderQueueMax;
[MarshalAs(UnmanagedType.I1)]
public bool requireShadowCasting;
[MarshalAs(UnmanagedType.I1)]
public bool requireRenderObjectId;
public static FilteringSettings CreateDefault(
RendererListType rendererListType)
{
FilteringSettings filteringSettings =
new FilteringSettings
{
renderQueueMin = int.MinValue,
renderQueueMax = int.MaxValue
};
switch (rendererListType)
{
case RendererListType.Opaque:
filteringSettings.renderQueueMax =
kTransparentRenderQueue - 1;
break;
case RendererListType.Transparent:
filteringSettings.renderQueueMin =
kTransparentRenderQueue;
break;
case RendererListType.ShadowCaster:
filteringSettings.requireShadowCasting = true;
break;
case RendererListType.ObjectId:
filteringSettings.requireRenderObjectId = true;
break;
}
return filteringSettings;
}
}
}

View File

@@ -0,0 +1,27 @@
using System.Runtime.InteropServices;
namespace XCEngine.Rendering
{
[StructLayout(LayoutKind.Sequential)]
public struct RendererListDesc
{
public RendererListType type;
public FilteringSettings filtering;
public SortingSettings sorting;
public static RendererListDesc CreateDefault(
RendererListType rendererListType)
{
return new RendererListDesc
{
type = rendererListType,
filtering =
FilteringSettings.CreateDefault(
rendererListType),
sorting =
SortingSettings.CreateDefault(
rendererListType)
};
}
}
}

View File

@@ -0,0 +1,9 @@
namespace XCEngine.Rendering
{
public enum RendererSortMode
{
None = 0,
FrontToBack = 1,
BackToFront = 2
}
}

View File

@@ -67,12 +67,22 @@ namespace XCEngine.Rendering
public bool DrawRenderers(
SceneRenderPhase scenePhase,
RendererListType rendererListType)
{
return DrawRenderers(
scenePhase,
RendererListDesc.CreateDefault(
rendererListType));
}
public bool DrawRenderers(
SceneRenderPhase scenePhase,
RendererListDesc rendererListDesc)
{
return InternalCalls
.Rendering_ScriptableRenderContext_DrawRenderers(
.Rendering_ScriptableRenderContext_DrawRenderersByDesc(
m_nativeHandle,
(int)scenePhase,
(int)rendererListType);
ref rendererListDesc);
}
public bool RecordOpaqueScenePhase()
@@ -133,14 +143,16 @@ namespace XCEngine.Rendering
{
return DrawRenderers(
SceneRenderPhase.Opaque,
RendererListType.Opaque);
RendererListDesc.CreateDefault(
RendererListType.Opaque));
}
public bool DrawTransparentRenderers()
{
return DrawRenderers(
SceneRenderPhase.Transparent,
RendererListType.Transparent);
RendererListDesc.CreateDefault(
RendererListType.Transparent));
}
public RenderGraphTextureHandle CreateTransientTexture(

View File

@@ -0,0 +1,36 @@
using System.Runtime.InteropServices;
namespace XCEngine.Rendering
{
[StructLayout(LayoutKind.Sequential)]
public struct SortingSettings
{
public RendererSortMode sortMode;
public static SortingSettings CreateDefault(
RendererListType rendererListType)
{
SortingSettings sortingSettings =
new SortingSettings();
switch (rendererListType)
{
case RendererListType.Opaque:
case RendererListType.ShadowCaster:
case RendererListType.ObjectId:
sortingSettings.sortMode =
RendererSortMode.FrontToBack;
break;
case RendererListType.Transparent:
sortingSettings.sortMode =
RendererSortMode.BackToFront;
break;
default:
sortingSettings.sortMode =
RendererSortMode.None;
break;
}
return sortingSettings;
}
}
}