refactor(srp): close universal recording composition seam

This commit is contained in:
2026-04-19 17:00:48 +08:00
parent 6c605bbe20
commit 20e727e882
7 changed files with 305 additions and 112 deletions

View File

@@ -318,7 +318,7 @@ namespace Gameplay
}
}
internal sealed class ProbeSceneRenderer : ScriptableRenderer
internal class ProbeSceneRenderer : ScriptableRenderer
{
public ProbeSceneRenderer(
Action onOpaqueRecorded = null)
@@ -327,7 +327,7 @@ namespace Gameplay
}
}
internal sealed class ProbePostProcessRenderer : ScriptableRenderer
internal class ProbePostProcessRenderer : ScriptableRenderer
{
public ProbePostProcessRenderer(
Vector4 firstVectorPayload,
@@ -348,7 +348,7 @@ namespace Gameplay
}
}
internal sealed class ProbeUniversalRenderer : ScriptableRenderer
internal class ProbeUniversalRenderer : ScriptableRenderer
{
public ProbeUniversalRenderer(
Vector4 postProcessScale,
@@ -363,7 +363,7 @@ namespace Gameplay
}
}
internal sealed class ProbePlannedFullscreenRenderer : ScriptableRenderer
internal class ProbePlannedFullscreenRenderer : ScriptableRenderer
{
public ProbePlannedFullscreenRenderer()
{
@@ -709,7 +709,7 @@ namespace Gameplay
}
}
internal sealed class CameraDataObservationRenderer
internal class CameraDataObservationRenderer
: ScriptableRenderer
{
public CameraDataObservationRenderer()
@@ -801,7 +801,7 @@ namespace Gameplay
}
}
internal sealed class StageColorObservationRenderer
internal class StageColorObservationRenderer
: ScriptableRenderer
{
public StageColorObservationRenderer()
@@ -817,37 +817,77 @@ namespace Gameplay
}
}
public abstract class ProbeRendererPipeline
: ScriptableRenderPipeline
internal abstract class ProbeRendererData
: ScriptableRendererData
{
private ScriptableRenderer m_renderer;
protected abstract ScriptableRenderer CreateRenderer();
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
protected sealed override ScriptableRenderer CreateRenderer()
{
ScriptableRenderer renderer = GetOrCreateRenderer();
return renderer != null &&
renderer.SupportsStageRenderGraph(stage);
return CreateProbeRenderer();
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
protected abstract ScriptableRenderer CreateProbeRenderer();
}
internal sealed class ManagedRenderPipelineProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
ScriptableRenderer renderer = GetOrCreateRenderer();
return renderer != null &&
renderer.RecordStageRenderGraph(context);
return new ManagedRenderPipelineProbe();
}
}
internal sealed class ManagedPostProcessRenderPipelineProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
return new ManagedPostProcessRenderPipelineProbe();
}
}
internal sealed class ManagedUniversalRenderPipelineProbeRendererData
: ProbeRendererData
{
private readonly Vector4 m_postProcessScale;
public ManagedUniversalRenderPipelineProbeRendererData(
Vector4 postProcessScale)
{
m_postProcessScale = postProcessScale;
}
private ScriptableRenderer GetOrCreateRenderer()
protected override ScriptableRenderer CreateProbeRenderer()
{
if (m_renderer == null)
{
m_renderer = CreateRenderer();
}
return new ManagedUniversalRenderPipelineProbe(
m_postProcessScale);
}
}
return m_renderer;
internal sealed class ManagedPlannedFullscreenRenderPipelineProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
return new ManagedPlannedFullscreenRenderPipelineProbe();
}
}
internal sealed class ManagedRenderContextCameraDataProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
return new ManagedRenderContextCameraDataProbe();
}
}
internal sealed class ManagedRenderContextStageColorDataProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
return new ManagedRenderContextStageColorDataProbe();
}
}
@@ -859,48 +899,66 @@ namespace Gameplay
{
}
public sealed class ManagedRenderPipelineProbeAsset : ScriptableRenderPipelineAsset
public sealed class ManagedRenderPipelineProbeAsset
: UniversalRenderPipelineAsset
{
public static int CreatePipelineCallCount;
public ManagedRenderPipelineProbeAsset()
{
rendererData = new ManagedRenderPipelineProbeRendererData();
}
protected override ScriptableRenderPipeline CreatePipeline()
{
CreatePipelineCallCount++;
return new ManagedRenderPipelineProbe();
return base.CreatePipeline();
}
}
public sealed class ManagedPostProcessRenderPipelineProbeAsset : ScriptableRenderPipelineAsset
public sealed class ManagedPostProcessRenderPipelineProbeAsset
: UniversalRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
public ManagedPostProcessRenderPipelineProbeAsset()
{
return new ManagedPostProcessRenderPipelineProbe();
rendererData =
new ManagedPostProcessRenderPipelineProbeRendererData();
}
}
public sealed class ManagedUniversalRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
: UniversalRenderPipelineAsset
{
public static int CreatePipelineCallCount;
public Vector4 postProcessScale = new Vector4(1.03f, 0.98f, 0.94f, 1.0f);
public ManagedUniversalRenderPipelineProbeAsset()
{
rendererData = CreateRendererData();
}
protected override ScriptableRenderPipeline CreatePipeline()
{
CreatePipelineCallCount++;
return new ManagedUniversalRenderPipelineProbe(
postProcessScale);
rendererData = CreateRendererData();
return base.CreatePipeline();
}
private ScriptableRendererData CreateRendererData()
{
return new ManagedUniversalRenderPipelineProbeRendererData(
postProcessScale);
}
}
public sealed class ManagedPlannedFullscreenRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
: UniversalRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
public ManagedPlannedFullscreenRenderPipelineProbeAsset()
{
return new ManagedPlannedFullscreenRenderPipelineProbe();
rendererData =
new ManagedPlannedFullscreenRenderPipelineProbeRendererData();
}
}
internal sealed class ManagedCameraRequestConfiguredRendererData
@@ -921,15 +979,6 @@ namespace Gameplay
}
}
internal sealed class ManagedCameraRequestConfiguredRenderPipelineProbe
: ProbeRendererPipeline
{
protected override ScriptableRenderer CreateRenderer()
{
return new ProbeSceneRenderer();
}
}
public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset
: UniversalRenderPipelineAsset
{
@@ -940,20 +989,21 @@ namespace Gameplay
}
public sealed class ManagedRenderContextCameraDataProbeAsset
: ScriptableRenderPipelineAsset
: UniversalRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
public ManagedRenderContextCameraDataProbeAsset()
{
return new ManagedRenderContextCameraDataProbe();
rendererData =
new ManagedRenderContextCameraDataProbeRendererData();
}
}
public sealed class ManagedFinalColorRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
: UniversalRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
public ManagedFinalColorRenderPipelineProbeAsset()
{
return new ManagedRenderPipelineProbe();
rendererData = new ManagedRenderPipelineProbeRendererData();
}
protected override FinalColorSettings GetDefaultFinalColorSettings()
@@ -963,11 +1013,12 @@ namespace Gameplay
}
public sealed class ManagedRenderContextFinalColorDataProbeAsset
: ScriptableRenderPipelineAsset
: UniversalRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
public ManagedRenderContextFinalColorDataProbeAsset()
{
return new ManagedRenderContextCameraDataProbe();
rendererData =
new ManagedRenderContextCameraDataProbeRendererData();
}
protected override FinalColorSettings GetDefaultFinalColorSettings()
@@ -977,26 +1028,21 @@ namespace Gameplay
}
public sealed class ManagedRenderContextStageColorDataProbeAsset
: ScriptableRenderPipelineAsset
: UniversalRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
public ManagedRenderContextStageColorDataProbeAsset()
{
return new ManagedRenderContextStageColorDataProbe();
rendererData =
new ManagedRenderContextStageColorDataProbeRendererData();
}
}
public sealed class ManagedRenderPipelineProbe
: ProbeRendererPipeline
internal sealed class ManagedRenderPipelineProbe
: ProbeSceneRenderer
{
public static int SupportsStageCallCount;
public static int RecordStageCallCount;
protected override ScriptableRenderer CreateRenderer()
{
return new ProbeSceneRenderer();
}
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
@@ -1012,19 +1058,19 @@ namespace Gameplay
}
}
public sealed class ManagedPostProcessRenderPipelineProbe
: ProbeRendererPipeline
internal sealed class ManagedPostProcessRenderPipelineProbe
: ProbePostProcessRenderer
{
protected override ScriptableRenderer CreateRenderer()
{
return new ProbePostProcessRenderer(
public ManagedPostProcessRenderPipelineProbe()
: base(
new Vector4(1.10f, 0.95f, 0.90f, 1.0f),
new Vector4(0.95f, 1.05f, 1.10f, 1.0f));
new Vector4(0.95f, 1.05f, 1.10f, 1.0f))
{
}
}
public sealed class ManagedUniversalRenderPipelineProbe
: ProbeRendererPipeline
internal sealed class ManagedUniversalRenderPipelineProbe
: ProbeUniversalRenderer
{
public static int SupportsMainSceneCallCount;
public static int SupportsPostProcessCallCount;
@@ -1037,17 +1083,13 @@ namespace Gameplay
public ManagedUniversalRenderPipelineProbe(
Vector4 postProcessScale)
: base(
postProcessScale,
OnOpaqueRecorded)
{
m_postProcessScale = postProcessScale;
}
protected override ScriptableRenderer CreateRenderer()
{
return new ProbeUniversalRenderer(
m_postProcessScale,
OnOpaqueRecorded);
}
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
@@ -1084,37 +1126,25 @@ namespace Gameplay
return base.RecordStageRenderGraph(context);
}
private void OnOpaqueRecorded()
private static void OnOpaqueRecorded()
{
RecordSceneCallCount++;
}
}
public sealed class ManagedPlannedFullscreenRenderPipelineProbe
: ProbeRendererPipeline
internal sealed class ManagedPlannedFullscreenRenderPipelineProbe
: ProbePlannedFullscreenRenderer
{
protected override ScriptableRenderer CreateRenderer()
{
return new ProbePlannedFullscreenRenderer();
}
}
public sealed class ManagedRenderContextCameraDataProbe
: ProbeRendererPipeline
internal sealed class ManagedRenderContextCameraDataProbe
: CameraDataObservationRenderer
{
protected override ScriptableRenderer CreateRenderer()
{
return new CameraDataObservationRenderer();
}
}
public sealed class ManagedRenderContextStageColorDataProbe
: ProbeRendererPipeline
internal sealed class ManagedRenderContextStageColorDataProbe
: StageColorObservationRenderer
{
protected override ScriptableRenderer CreateRenderer()
{
return new StageColorObservationRenderer();
}
}
public sealed class RenderPipelineApiProbe : MonoBehaviour

View File

@@ -34,6 +34,8 @@ namespace Gameplay
public bool HasRendererBackedRenderPipelineAssetType;
public bool HasRendererBackedRenderPipelineType;
public bool HasRendererDrivenRenderPipelineType;
public bool HasPublicRendererSupportsStageRenderGraph;
public bool HasPublicRendererRecordStageRenderGraph;
public void Start()
{
@@ -47,6 +49,8 @@ namespace Gameplay
typeof(ScriptableRenderPipelineAsset);
System.Type rendererFeatureType =
typeof(ScriptableRendererFeature);
System.Type rendererType =
typeof(ScriptableRenderer);
System.Type universalAssemblyType =
typeof(ScriptableRendererFeature);
System.Reflection.Assembly universalAssembly =
@@ -166,6 +170,14 @@ namespace Gameplay
HasRendererDrivenRenderPipelineType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererDrivenRenderPipeline, XCEngine.RenderPipelines.Universal") != null;
HasPublicRendererSupportsStageRenderGraph =
rendererType.GetMethod(
"SupportsStageRenderGraph",
PublicInstanceMethodFlags) != null;
HasPublicRendererRecordStageRenderGraph =
rendererType.GetMethod(
"RecordStageRenderGraph",
PublicInstanceMethodFlags) != null;
}
}
}