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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace XCEngine.Rendering
|
||||
{
|
||||
public enum RendererSortMode
|
||||
{
|
||||
None = 0,
|
||||
FrontToBack = 1,
|
||||
BackToFront = 2
|
||||
}
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user