讲怔
2025-9-28 18:33:50
【从UnityURP开始探索游戏渲染】专栏-直达
SRP提供的核心功能与架构
可编程管线基础
RenderPipeline基类
通过继承该类并重写Render()方法,开发者可自定义渲染流程调度逻辑,替代传统固定管线。(URP中UniversalRenderPipeline : RenderPipeline 继承并重写Render方法。)
ScriptableRenderContext
作为C#脚本与底层图形API的桥梁,允许通过代码调度渲染命令(如剔除、绘制)。(public struct ScriptableRenderContext : IEquatable定义自定义渲染管道 使用的状态 和绘图命令 。)
管线资源分离机制
RenderPipelineAsset:存储配置数据(如材质、Shader参数)(URP中是
public partial class UniversalRenderPipelineAsset : RenderPipelineAsset, ISerializationCallbackReceiver)
RenderPipelineInstance:执行实际渲染逻辑的实例类。(在URP中,上面的RenderPipelineAsset资产类中重写protected override RenderPipeline CreatePipeline()方法,在其中创建渲染管线实例var pipeline = new UniversalRenderPipeline(this);)
关键扩展点
事件回调
通过RenderPipelineManager订阅渲染生命周期事件(如beginContextRendering),在特定阶段注入自定义逻辑。
动态渲染策略
支持运行时切换渲染路径(如正向/延迟渲染),适应不同硬件性能需求(这里的渲染路径是URP或HDRP自己实现的,例如Forward+也是,所以这个渲染路径只是实现管线时的自定义渲染策略,所以运行时能切换。但是一般不建议切换,因为各种shader实现时都会根据渲染路径实现相应执行的Pass,如果随便切换,会导致部分shader可能因为只适配某种渲染路径,对其他渲染路径显示渲染异常。)。
URP在SRP上的具体实现
资源与实例初始化
URP管线资源 (UniversalRenderPipelineAsset):
实例化流程 :
核心渲染流程分解
URP将渲染分为五个阶段,均在Render()方法中调度:
阶段 URP实现细节 准备阶段 收集场景渲染对象与光源数据,配置相机参数与目标纹理。几何阶段 执行视锥剔除,生成GPU顶点数据;通过ScriptableRenderContext.DrawRenderers提交绘制命令。光照阶段 采用简化PBR模型:计算实时光源贡献,支持烘焙光照混合;动态光源采用Tile-Based优化策略(Forward+路径时)。光栅化阶段 执行深度预通道(Depth Prepass)减少过度绘制,结合GPU Instancing优化批次处理。后处理阶段 在独立Pass中应用抗锯齿(FXAA/TAA)、Bloom等效果,支持自定义RendererFeature扩展 。性能优化关键技术
SRP Batcher :对相同Shader变体但不同材质的物体进行动态合批,显著降低SetPass Call。
光照剔除优化 :按层级控制剔除距离(layerCullDistances),对静态物体预计算遮挡数据。
URP对SRP的扩展与简化
标准化功能封装
内置轻量级PBR光照模型,取代HDRP的复杂物理模拟以提升跨平台性能。
集成Shader Graph 可视化工具链,降低着色器开发门槛。(后期版本内置管线也可用ShaderGraph了)
跨平台适配策略
动态切换渲染精度(如移动端禁用实时阴影),通过QualitySettings分级配置。
资源包精简:剔除HDRP的高精度贴图与计算密集型特效,缩小运行时内存占用。
对URP的扩展
URP基本管线流程在UniversalRenderer的构造函数中已经定义完整。并且在其中每个阶段都给出了插入点。那么只需要在这些插入点用创建RendererFeature的方式插入自定义的Pass来影响和扩充基本的URP管线。
还有一种方式用RenderPipelineManager 提供的点位插入自定义Pass。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言 探讨,更多人加入进来能更加完善这个探索的过程,
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
相关推荐