Unity的三级排序层级渲染Layer,sorting layer,order in layer

2023-11-19

一. 前言
Unity游戏开发中,模型、界面、特效等等,需要规划好层的概念,涉及到摄像机(Camera)、画布(Canvas)、Shader等相关内容。

 Unity大致按照三级排序进行层级渲染:Camera的Depth CullingMask > Canvas的Sorting Layer > Canvas的Order in Layer

二. 摄像机(Camera)
一般3D游戏项目,会创建至少两个摄像机,一个3D摄像机(使用透视视角)和一个UI摄像机(使用正交视角)。

1. 3D摄像机

在这里插入图片描述

2. UI摄像机

在这里插入图片描述

3. 摄像机的Depth和Clear Flags设置


一般UI摄像机的Depth要大于3D摄像机的Depth,这样才能使UI在3D摄像机渲染的物体的前面显示
摄像机的Clear Flags建议使用Depth only,然后在Culling Mask选择相应的层(Layer)。
比如3D摄像机的Culling Mask如下:

在这里插入图片描述

UI摄像机的Culling Mask如下:

在这里插入图片描述

这个Culling Mask的下拉列表中就是一个个的层(Layer),如果要添加新的层,可以点击Inspector窗口中的Layer,然后点击Add Layer...进行添加。

在这里插入图片描述

在这里插入图片描述
创建3D物体或UI界面的时候,都会设定物体的Layer,3D物体默认是Default层,UI默认是UI层。

在这里插入图片描述

 

摄像机会根据Depth从小到大的顺序,渲染各自Culling Mask的层。
注意,在世界坐标下,物体A挡在物体B前面,但是只要渲染物体A的摄像机的Depth大于渲染物体B的摄像机的Depth,那么在Game视图中看到的效果就是物体B挡在物体A前面,如果物体A和物体B同在一个摄像机中渲染,那么正常情况下就是物体A挡住物体B(这里说正常情况下,是因为还可以通过下文的RenderQueue、SortingLayer、SortingOrder等的设置,让物体B挡在物体A前面)。

三. 画布(Canvas)


UGUI中,所有UI元素都必须在画布(Canvas)的子节点中。Canvas的Render Mode一般是使用Screen Space - Camera模式,把UICamera赋值给Canvas的Render Camera

在这里插入图片描述

这个时候,可以看到Canvas的面板中,出现了两个关键的属性:Sorting Layer、Order in Layer。

 

1. Sorting Layer


添加Sorting Layer可以点击Inspector窗口的Tag -> AddTag -> SortingLayer

在这里插入图片描述

然后Canvas就可以在Sorting Layer中看到新加的Sorting Layer了(有点绕口)

为什么要有这个Sorting Layer呢,因为我们可以创建很多个Canvas,默认Sorting Layer是Default,这个时候,渲染顺序是根据Canvas的节点在Hierarchy窗口中的顺序来决定的,上层的节点先渲染,下层的节点后渲染。
而有时候,可能需要打破这个顺序,让上层节点的Canvas后渲染,这个时候,就可以设置这个Sorting Layer为高的值,当然,也可以保持相等,通过设置Order in Layer。

拓展:UGUI会自动合并批次,原理是它会把一个Canvas下的所有元素合并在一个Mesh里,如果Canvas下的元素很多,任意一个元素发生位置、大小的改变,就需要重新合并所有元素的Mesh。如果元素非常多的话,就可能会造成卡顿。
一个比较好的做法是每个UI界面都设置成一个Canvas。如果这个界面下的元素比较多,可以考虑嵌套多几个Canvas。尤其是会频繁改变位置大小的元素,这样可以降低它们合并Mesh的开销。但是Canvas嵌套太多也不好,Mesh合并是降低了,但是DrawCall又上去了,因为每个Canvas都会单独占用一个DrawCall

 

注意:到这里,应该明白了Layer与Sorting Layer无关,它们是两个概念:Layer是相机的相对深度值的渲染CullingMask层级,  SortingLayer是UGUI中Canvas画布的渲染层级。

 

2. Order in Layer


Order in Layer顾名思义,就是Sorting Layer的内部排序,这样配合Sorting Layer就是两级的排序,可以解决大部分情况的渲染顺序需求。
当然,如果创建多个UI摄像机,不同Canvas绑定不同的UI摄像机,再配合摄像机的Depth,就是三级排序,但一般不创建太多的UI摄像机,除非逼不得已。

小结: 渲染排序级别:Camera的Depth > Canvas的Sorting Layer > Canvas的Order in Layer

另外,ParticleSystem也有Sorting Layer和Order in Layer。

在这里插入图片描述

 

四. Shader的RenderQueue


Unity提供给我们一些默认的渲染队列,每一个对应一个唯一的值,来指导Unity绘制对象到屏幕上。这些内置的渲染队列被称为Background, Geometry, AlphaTest, Transparent, Overlay。这些队列不是随便创建的,它们是为了让我们更容易地编写Shader并处理实时渲染的。
示例

Tags{ "RenderType" = "Geometry" }
1
在材质球中可以看到显示。


Properties    Value    渲染队列描述    备注
Background    1000    This render queue is rendered before any others.    这个队列通常被最先渲染(比如 天空盒)。
Geometry    2000    Opaque geometry uses this queue.    这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。
AlphaTest    2450    Alpha tested geometry uses this queue.    需要开启透明度测试的物体。Unity5以后从Geometry队列中拆出来,因为在所有不透明物体渲染完之后再渲染会比较高效。
GeometryLast    2500    Last render queue that is considered “opaque”    所有Geometry和AlphaTest队列的物体渲染完后
Transparent    3000    This render queue is rendered after Geometry and AlphaTest, in back-to-front order.    所有Geometry和AlphaTest队列的物体渲染完后,再按照从后往前的顺序进行渲染,任何使用了透明度混合的物体都应该使用该队列(例如玻璃和粒子效果)
Overlay    4000    This render queue is meant for overlay effects.    该队列用于实现一些叠加效果,适合最后渲染的物体(如镜头光晕)。
当RenderQueue填-1是使用shader自定义的值,否则使用手动填的值。
2500是关键值,它是透明跟不透明的分界点。
知识点:
RenderQueue > 2500的物体绝对会在RenderQueue <= 2500的物体前面,即渲染时RenderQueue大的会挡住RenderQueue小的,不论它的Sorting Layer和Order in Layer怎么设置都是不起作用的。

当两个的RenderQueue都在同一侧时,在Sorting Layer高的绝对会在Sorting Layer前面,无视RenderQueue跟Order in Layer,只有在Sorting Layer相同的前提下,Order in Layer高的会在Order in Layer低的前面,无视RenderQueue。当Sorting Layer跟Order in Layer相同时,才看RenderQueue的高低,高的在前面。
 

小结:

1、Sprite Renderer、ParticleSystem有sorting layer,order in layer。

2、Canvas根据Render Mode的不同,属性显示不同,当为ScreenSpace-Overlay时,只有sort Order属性,其他两种模式有sorting layer和order in layer属性,原因是Screen Space-Overlay渲染模式下,UI元素将在场景的上面,不受sorting layer的影响。

3、Layer与sortinglayer无关,layer是对游戏中所有物体分类别划分,便于相机拣选,在camera的Culling mask进行选择。

4、sorting layer与渲染次序相关,根据sortingin layer中设置的先后顺序依次渲染。Order in layer是在同一个sorting layer内的细分,根据数值由小到大依次渲染。(渲染优先级为Camera.depth,sorting layer,order in layer)

5、UGUI画布上面的UI对象的层级关系不受Z轴的影响,按照hierachy中由上到下的顺序进行渲染。游戏对象层的Z轴影响渲染顺序,渲染优先级处于Camera.depth,sorting layer,order in layer之后。

 

https://blog.csdn.net/linxinfa/article/details/105361396

https://www.bilibili.com/video/av795044814/

 

Demo: 

下载地址: https://github.com/petergjh/u3dcrash/tree/master/TestUGUI

正常情况ImageUIPop和ImgUI都继承了Canvas的层级,ImgUI控件在ImageUIPop下面,所以先渲染黄色,再渲染红色,此时重叠部分的效果是红色遮挡了黄色

这时如果想要黄色在上面,红色在下面

方法一:交互两个控件的位置

,把ImageUIPo移到下面,就会拒黄色遮挡红色:

方法二: 手动给控件增加层级组件设置不同层级

第一步先在右上角Tag里添加一个新的 SortingLayer层

注意不是右上角的Layer (相机的CullingMask层)

 

 

第二步,给ImageUIPop 添加Canva画布组件

 第三步:设置渲染模式为相机渲染

在前面的Canvas上点选OverrideSorting,这时只显示了SortOrder值来确定显示层次

我们查看继承的父Canvas属性里的渲染模式设置:默认的是ScreenSpace - Overlay

把画布的渲染模式修改为第二个 ScreenSpace - Camera 相机渲染模式

 

第四步,把UICamera赋值给Canvas的Render Camera

这时出现了画布的SortingLayer和Order in Layer选项,默认的SortingLayer是Default

查看黄色区域控件,前面新增的Canvas继承了父Canvas的渲染模式

第五步,设置相机渲染的SortingLayer值

修改继承过来的SortingLayer值,设置为前面新增的PopUI层:

我们发现,虽然ImageUIPop黄色区域在ImgUI红色控件的上层,但因为渲染层级改为更前面的PopUI层,会让ImagUIPop黄色区域显示在红色的前面

相机会先渲染SortingLayer的Default默认层,再渲染PopUI层

 

 

另外注意, 如果黄色这个pop层是一个弹窗需要点击时关闭,那就需要格外添加射线检测,

添加GraphicRaycaster物理射线检测组件

 

</article>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity的三级排序层级渲染Layer,sorting layer,order in layer 的相关文章

  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • 【干货】如何实现WinApp的UI自动化测试?

    WinApp WindowsAPP 是运行在Windows操作系统上的应用程序 通常会提供一个可视的界面 用于和用户交互 例如运行在Windows系统上的Microsoft Office PyCharm Visual Studio Code
  • 探索创意无限的Photoshop CC 2020Mac/Win版

    作为一款功能强大的图像处理软件 Photoshop CC 2020 简称PS 2020 在全球范围内备受设计师 摄影师和艺术家的喜爱和推崇 它不仅为用户提供了丰富多样的工具和功能 还不断推出新的创意特效和改进的功能 让用户的创意无限延展 首
  • 【QView】基于QML的UI组件框架 之 AImage (图片)

    先上结果演示 环境 不说版本就是耍流氓 硬件 通用PC 手机 Jetson Xavier NX 套件 均测试有效 系统 Ubuntu 20 04 Android Windows 均测试有效 软件 基于QT6 2 4 Qml 功能描述 AIm
  • 296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI

    1 根因分析 根因分析 当有新版本并且grade等级是2的时候 点击ptz的时候使用的是RSDialog WA DeleteOnClose属性默认是为true的 并且是栈上的变量 当关闭ptz的时候 diolog的exec结束会向系统发送延
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • APP UI自动化测试思路总结

    首先想要说明一下 APP自动化测试可能很多公司不用 但也是大部分自动化测试工程师 高级测试工程师岗位招聘信息上要求的 所以为了更好的待遇 我们还是需要花时间去掌握的 毕竟谁也不会跟钱过不去 接下来 一起总结一下APP UI自动化测试的思路吧
  • WPF应用实战开发指南 - 如何实现动态内容展示

    在我们开发一些复杂信息的时候 由于需要动态展示一些相关信息 因此我们需要考虑一些控件内容的动态展示 可以通过动态构建控件的方式进行显示 如动态选项卡展示不同的信息 或者动态展示一个自定义控件的内容等等 目的就是能够减少一些硬编码的处理方式
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 界面控件DevExpress WPF属性网格 - 让应用轻松显示编辑各种属性事件

    DevExpress WPF Property Grid 属性网格 灵感来自于Visual Studio Visual Studio启发的属性窗口 对象检查器 让在WPF应用程序显示和编辑任何对象的属性和事件变得更容易 P S DevExp
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM

随机推荐

  • wireshark 实用过滤表达式

    wireshark 实用过滤表达式 针对ip 协议 端口 长度和内容 1 关键字 与 eq 和 等同 可以使用 and 表示并且 或 or 表示或者 非 和 not 都表示取反 多组条件联合过滤数据包的命令 就是通过每个单个的条件命令与关键
  • python教程29-继承的基本使用、继承的注意事项、类方法和静态方法回顾、私有属性的继承特点、新式类和经典类

    python教程 小白入门2021 4 5 学习目标 文章目录 python教程 小白入门2021 4 5 P 168 继承的基本使用 P169 继承的注意事项 P170 类方法和静态方法回顾 P171 私有属性的继承特点 P172 新式类
  • 干货:Java正确获取客户端真实IP方法整理

    在JSP里 获取客户端的IP地址的方法是 request getRemoteAddr 这种方法在大部分情况下都是有效的 但是在通过了Apache Squid等反向代理软件就不能获取到客户端的真实IP地址了 如果使用了反向代理软件 将http
  • Leetcode.406 经典算法题:根据身高重建队列

    假设有打乱顺序的一群人站成一个队列 数组 people 表示队列中一些人的属性 不一定按顺序 每个 people i hi ki 表示第 i 个人的身高为 hi 前面 正好 有 ki 个身高大于或等于 hi 的人 请你重新构造并返回输入数组
  • 使用Idea更新数据库表的数据

    tags IDEA 我们在做案例的时候 经常需要改变数据表中的数据来进行简单测试 那我们在Idea下是如何修改数据表的数据的呢 我们可以看下面的图片 只要选择updata就行了 后面再按自动提交的标志 如果您觉得这篇文章帮助到了您 可以给作
  • JavaWeb05(删除&增加&修改功能实现&连接数据库)

    目录 一 实现删除功能 1 1 url如何传参 xx do 参数 参数值 参数名 参数值 1 2 servlet如何拿对应值 根据参数名拿到对应的参数值 String str req getParameter 参数名 1 3 如何询问 nc
  • sql: paging in SQL Server

    sql server 2012 及以上 涂聚文 Geovin Du geovindu 注 SELECT FROM BookKindList ORDER BY SELECT NULL OFFSET 0 ROWS FETCH NEXT 3 RO
  • 数学建模4 论文写作排版和技巧

    文字 标题一 四号黑体 标题二 三 小四号黑体 正文 宋体小四 行距1 5 标题前后空0 5行 英文和数字使用Times New Roman 小四 包括表格中的内 表头在表格上方 需写成 表1 什么什么表 黑体小五加粗 居中 图名在图下 需
  • Saas-Export项目之部门数据回显(下拉框和单选框回显)

    Saas Export项目之部门数据回显 之前的经验 做数据回显一般就是在数据修改时需要查询出这条信息 然后再将数据拆分每一项逐一赋值在表单上 通常赋值就行 而且都是input type text这种类型的 所有只要在input里增加val
  • 推荐 4 个本月火火火的开源项目

    本期推荐开源项目目录 1 开源的 AI 生成图像 APP 2 属于你的微信聊天机器人 3 好玩的 Windows 桌面应用 4 Windows 12 网页版 01 开源的 AI 生成图像 APP 该开源项目技术栈基于 Next js Cha
  • 与Miriam Suzanne一起进行Sass,Susy,单元测试和寻找声音

    In this episode of the Versioning Show Tim and David are joined by Miriam Suzanne best known for Susy a responsive layou
  • jmockit使用(一) —— mock 系统时间

    一 mock工具被广泛的应用于单测中 尤其是当测试环境系统依赖的外部项较多 而且不受控制时 jmockit一般有2种方式 一种是基于行为的方式 使用者在单测类中写 Expectations 里面放置 预期 会被执行的代码段和返回 这就是一种
  • 12款最常使用的网络爬虫工具推荐

    网络爬虫在当今的许多领域得到广泛应用 它的作用是从任何网站获取特定的或更新的数据并存储下来 网络爬虫工具越来越为人所熟知 因为网络爬虫简化并自动化了整个爬取过程 使每个人都可以轻松访问网站数据资源 使用网络爬虫工具可以让人们免于重复打字或复
  • VTK7.1.1+VS2017+QT的安装与配置

    本文转载自 https blog csdn net hebbely article details 81067505 简述 为了实现RealSense的PCL点云显示 需要VTK支持 由于整个平台在Qt环境实现 VTK编译为Qt插件 QVT
  • YOLO v5 引入解耦头部

    YOLO v5 引入解耦头部 最近想开个 深度学习模型搭建 opencv方面的训练营 有兴趣可以私聊我 文章目录 YOLO v5 引入解耦头部 前言 一 解耦头部示意图 二 在YOLO v5 中引入解耦头部 1 修改common py文件
  • Sqlite3 常见几种数据插入方式性能比较

    include
  • 【读写锁 ReadWriteLock 结合 LinkedHashMap】

    import java util LinkedHashMap import java util Map import java util concurrent locks ReadWriteLock import java util con
  • 微信小程序自定义tree组件,拿走直接用

    工作原因 微信小程序需要一个功能类似于elemenui中的tree组件 找了好多ui组件库没有能直接用的 最后自己写了一套 封装成组件 中心技术是组件本身递归 只需要在父级页面传 树列表数据 和 选中的节点id 就可以用了 tree组件 t
  • 期货计算题

    期货考试计算题精选及答案 1 1月5日 大连商品交易所黄大豆1号3月份期货合约的结算价是2800元 吨 该合约下一交易日跌停板价格正常是 元 吨 A 2716 B 2720 C 2884 D 2880 答案 A 分析 本题考察的是期货合约涨
  • Unity的三级排序层级渲染Layer,sorting layer,order in layer

    一 前言 Unity游戏开发中 模型 界面 特效等等 需要规划好层的概念 涉及到摄像机 Camera 画布 Canvas Shader等相关内容 Unity大致按照三级排序进行层级渲染 Camera的Depth CullingMask gt