【渲染管线】UnityURP[渲染顺序]与[层级]

【从UnityURP开始探索游戏渲染】专栏-直达

介绍与历史发展

Unity的渲染顺序系统经历了从Built-in管线到可编程渲染管线(SRP)的演进。在传统Built-in管线中,渲染顺序主要由摄像机深度和材质RenderQueue决定,而URP(Universal Render Pipeline)作为SRP的一种实现,提供了更灵活可控的渲染顺序管理机制。

URP的前身是LWRP(轻量级渲染管线),在Unity 2019中成为默认管线并更名为URP,它替代了原来的Built-in管线,引入了全新的渲染架构。URP的渲染主入口在UniversalRenderPipeline类,它继承自RenderPipeline,是整个渲染流程的关键类.

内置管线与URP渲染顺序对比

内置管线渲染顺序

内置管线主要依赖以下因素决定渲染顺序:

  • 摄像机Depth值:深度小的先渲染
  • 材质RenderQueue:数值小的先渲染
  • 物体与摄像机的距离:近的物体先渲染(不透明物体)或后渲染(透明物体)

内置管线将渲染队列分为:

  • Opaque队列(RenderQueue<2500):不透明物体
  • Transparent队列(RenderQueue≥2500):透明物体

URP渲染顺序

URP在继承内置管线部分特性的基础上,引入了更多控制维度:

‌基础排序规则‌:

  • Camera Depth仍为最高优先级
  • 新增Priority属性控制材质渲染顺序(值越小渲染越晚)
  • 支持基于Sorting Layer和Order in Layer的分层渲染

‌多摄像机共存机制‌:

  • 采用base-overlay模式,由base摄像机与多个overlay摄像机组成
  • overlay摄像机按Stack List中的顺序绘制

‌渲染队列处理‌:

  • 当RenderQueue分别在0-2500和2501-5000时,按RenderQueue绘制,无视SortingLayer/OrderInLayer

    • Unity Shader中的渲染顺序层主要通过渲染队列(RenderQueue)实现,每个队列对应一个索引号来控制物体的渲染优先级,索引值越小越优先渲染。‌

    SubShader中Tags{ "Queue" = "Transparent"}

    以下是Unity中主要的渲染顺序层及其索引号列表:

    • Background: 1000(最早渲染,用于天空盒等背景物体)‌
    • Geometry: 2000(用于大多数不透明物体,如默认着色器)‌
    • AlphaTest: 2450(用于需要Alpha测试的物体,如透明裁剪植被)‌
    • Transparent: 3000(用于半透明物体,如粒子或透明材质)‌
    • Overlay: 4000(最后渲染,用于屏幕特效如光晕或GUI)‌

    这些索引值的顺序确保了渲染效率,其中不透明队列(值 < 2500)通常从前向后渲染,而半透明队列(值 > 2500)从后向前渲染以避免视觉错误。

    "Transparent+1"使用+1方式明确表示层级被优先渲染。

  • 同队列范围内时,SortingLayer和OrderInLayer生效

渲染顺序解决的问题

‌视觉正确性‌

  • 确保透明物体在不透明物体之后渲染,实现正确的混合效果

‌性能优化‌

  • 通过合理排序减少overdraw(过度绘制),提高渲染效率

‌艺术控制‌

  • 允许美术师通过层级设置控制场景元素的显示优先级

‌多摄像机协作‌

  • 支持UI摄像机与场景摄像机的分层渲染

‌平台适配‌

  • 在移动设备上可通过调整渲染顺序优化性能

URP渲染顺序的使用方法

基础设置

  • ‌通过材质Priority属性‌:

    csharp 复制代码
    csharp
    material.renderQueue = 2001;// 设置渲染队列
    material.priority = -1;// 设置优先级(URP特有)

    值越小渲染越晚

  • ‌通过Sorting Layer和Order in Layer‌:

    • 在Tags and Layers中定义Sorting Layer
    • 设置Renderer的Sorting Layer和Order in Layer

高级控制

  • ‌使用RenderObjects特性‌:

    在URP Asset中添加Renderer Feature,通过Filter Settings控制特定对象的渲染顺序

  • ‌多Pass渲染‌:

    • 使用UniversalForward Pass进行主光照渲染
    • 使用SRPDefaultUnlit Pass进行无光照渲染
  • ‌动态修改URP设置‌:

    csharp 复制代码
    csharp
    var pipelineAsset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;
    pipelineAsset.supportsHDR = false;
    pipelineAsset.msaaSampleCount = 4;

    可动态调整管线参数影响整体渲染顺序

透明物体处理

  • ‌着色器中设置‌:

    c 复制代码
    shader
    Tags { "RenderType"="Transparent" "Queue"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha

    确保透明物体正确混合

  • ‌避免深度冲突‌:

    通过调整物体位置或使用Offset因子解决透明物体间的深度问题

URP的渲染顺序系统相比内置管线提供了更精细的控制能力,开发者可以根据项目需求灵活调整渲染顺序,在保证视觉效果的同时优化性能


【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
peter67681 天前
unity2d游戏开发经验总结
unity
郝学胜-神的一滴1 天前
游戏设计:原型与开发 19:U3D工位布置与性格说明书
人工智能·算法·unity·unreal engine·游戏策划·游戏设计
Aman19841 天前
Claude Code做Unity项目移植(二): 自动执行只读操作,告别频繁的
unity·游戏开发·vibe coding·claude code
暴走约伯2 天前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
郝学胜-神的一滴2 天前
游戏设计:原型与开发 18:Unity入门的第一课
人工智能·程序人生·游戏·ui·unity·游戏引擎
淡海水2 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
LF男男2 天前
Flower Defense—UIFacade
unity
呆呆敲代码的小Y2 天前
【实战精选面试题】Unity精选面试题详细解答,按模块整理汇总
人工智能·游戏·unity·游戏引擎
小贺儿开发3 天前
《流光绘忆》Unity 沉浸式光影互动
科技·unity·ai·程序员·工具·互动·光影
Aman19843 天前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移