Align URP scene drawing with RenderGraph renderer lists

This commit is contained in:
2026-04-28 00:03:24 +08:00
parent 6b488d5eac
commit 03967b152d
13 changed files with 908 additions and 48 deletions

View File

@@ -39,7 +39,7 @@ Unity 兼容的公开命名、对象所有权和扩展点。
Opaque、skybox、transparent、depth、shadow、post 和 final-output 流程应来自 URP
blocks 和 passes。
- 保持 `DrawObjectsPass``DrawSkyboxPass` 作为 managed URP pass declarations并通过
renderer-list/native scene-recorder backends 执行。
RenderGraph renderer-list declarations 和 native scene draw backend 执行。
- 收紧 stage 支持规则。如果 fullscreen 或 main-scene stage 需要 managed graph recording
必须要求所选 renderer/pipeline 支持并记录该 stage。
- 只在 Unity 形态的 API 后面扩展 managed RenderGraphresource declarations、frame data、
@@ -216,9 +216,10 @@ Managed SRP assets 通过 `GraphicsSettings.renderPipelineAsset` 选择,并通
- Mono 创建 `MonoManagedRenderPipelineAssetRuntime``MonoManagedRenderPipelineStageRecorder`
Scriptable context、planning context、camera request context、scene setup context 和 shadow execution
context handles 都是临时 native registry entries。不要在调用之外保存 managed context objects。
- 当前 Mono-backed SRP assets 显式使用 `DefaultNativeBackend` 做 scene drawing。Managed
`ScriptableRenderContext.DrawRenderers``DrawSkybox` 委托给 `NativeSceneRecorder` 以及 native
`SceneDrawBackend`
- 当前 Mono-backed SRP assets 显式使用 `DefaultNativeBackend` 做 scene drawing。URP 内置对象和 skybox
drawing 通过 managed RenderGraph 声明 renderer list、attachments 和 render func再由 native
`SceneDrawBackend` 执行。`ScriptableRenderContext.DrawRenderers``DrawSkybox` 仍作为 SRP v1 兼容入口保留,
并委托给 `NativeSceneRecorder`
- Managed resource/version invalidation 是正确性的一部分。如果 managed asset、renderer data 或 feature
修改 runtime state调用 `SetDirty` 或本地 invalidation helper确保 native runtime caches 被释放。
当前 runtime version 也会兜底 hash `UniversalRenderPipelineAsset` 的 shadow/final-color settings以及
@@ -279,12 +280,19 @@ Managed RenderGraph 目前有意保持较小,但应维持 Unity 的现代形
`XCEngine.Rendering.RenderGraphModule.RenderGraph.AddRasterPass`
`RenderGraphRasterPassBuilder` 进行。
- Public passes 应声明 reads、bindings、color attachments、depth attachment 和 render func然后 `Commit`
- Renderer-list drawing 是 RenderGraph authoring 的一等声明:先用
`RenderGraph.CreateRendererList(RendererListDesc, DrawingSettings)` 创建 `RendererListHandle`,再通过
`RenderGraphRasterPassBuilder.UseRendererList` 声明 pass 依赖,最后在 render func 中调用
`CommandBuffer.DrawRendererList`。URP 内置 `DrawObjectsPass` 必须走这条路径。
- Skybox drawing 也应从 managed raster pass 的 render func 进入 `CommandBuffer.DrawSkybox`。URP 内置
`DrawSkyboxPass` 不应再直接在 recording 阶段调用 `ScriptableRenderContext.DrawSkybox`
- Internal fullscreen helpers例如 color scale、shader vector 和 final color是 URP implementation details。
不要把它们作为 public `ScriptableRenderContext` shortcuts 暴露。
- Managed `SetRenderFunc` 是 deferred RenderGraph execution callback。Mono bridge 必须 retain delegate
在 native graph pass 执行时创建 pass-scoped `CommandBuffer`,并把已支持的 managed command stream flush 到
当前 `RHICommandList`。当前公开且已测试的命令子集是 `CommandBuffer.ClearRenderTarget(Color)`,写向 pass
的 primary color attachment没有 native command stream 和 executor 测试的命令不要暴露成 public API。
当前 `RHICommandList`。当前公开命令子集是 `CommandBuffer.ClearRenderTarget(Color)`
`CommandBuffer.DrawRendererList(RendererListHandle)``CommandBuffer.DrawSkybox()`;没有 native command stream
和 executor 测试的命令不要暴露成 public API。
- Public RenderGraph frame data 由同一个 renderer stage 内记录的所有 passes 共享。保持 `ContextContainer`
作为 stage frame data而不是 pass-local scratch data。
- Fullscreen internal passes 需要有效 `sourceColorTexture``primaryColorTarget`。Multi-pass fullscreen chains
@@ -350,10 +358,10 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
### 当前债务
- Managed SRP 仍是 SRP v1 surface。Main scene drawing 通过 managed calls 记录,但由 native scene draw
backends 执行。
- Managed `CommandBuffer` 已能随 public `SetRenderFunc` 延迟到 RenderGraph 执行期运行,但当前只收口了
`ClearRenderTarget(Color)` 这一条受测命令。它不是完整 Unity `CommandBuffer`;新增命令必须一起补
- Managed SRP 仍是 SRP v1 surface。Main scene drawing 现在可通过 managed RenderGraph renderer-list
declarations 记录,但实际绘制仍由 native scene draw backends 执行。
- Managed `CommandBuffer` 已能随 public `SetRenderFunc` 延迟到 RenderGraph 执行期运行,但它不是完整 Unity
`CommandBuffer`;新增命令必须一起补
native command stream、RHI flush 和 scripting bridge tests。
- Managed RenderGraph 当前暴露 raster authoring。Native graph 有 compute pass support但 managed compute
authoring 还未公开。
@@ -401,7 +409,13 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
details。
- Public managed `SetRenderFunc` 已从 recording-time 调用改为 RenderGraph execution-time 调用;
native 通过 retained managed delegate 和 pass-scoped `CommandBuffer` bridge 执行已支持的 command stream
当前受测命令为 `CommandBuffer.ClearRenderTarget(Color)`
当前支持 `CommandBuffer.ClearRenderTarget(Color)``CommandBuffer.DrawRendererList(RendererListHandle)`
`CommandBuffer.DrawSkybox()`
- Renderer-list drawing 已成为 managed RenderGraph 声明:`RenderGraph.CreateRendererList` 创建
`RendererListHandle``RenderGraphRasterPassBuilder.UseRendererList` 把 renderer list 纳入 pass declaration
`CommandBuffer.DrawRendererList` 在 RenderGraph 执行期触发 native `SceneDrawBackend`。URP 内置
`DrawObjectsPass``DrawSkyboxPass` 已迁离 recording-time `ScriptableRenderContext.DrawRenderers/DrawSkybox`
主路径。
- Public `ScriptableRenderPass.RecordRenderGraph(RenderGraph, ContextContainer)` 通过 `RenderingData`
`CameraData``LightingData``ShadowData``EnvironmentData``FinalColorData``StageColorData`
接收真实 URP frame data。