Unity UGUI的Canvas以及内部元素之间遮挡关系调整

调UI遮挡关系有三种思路:

  • 调Sorting Layer,层级越后渲染到越前面
  • 调Order in Layer,数字越大渲染到越前面
  • 修改UI材质调RenderQueue,数字越大越后渲染

对前两种比较陌生的同学可以看一下我以前写的这篇,不看也没事,后面会解释Unity Canvas的sorting Layer作用_unity sortinglayer-CSDN博客 

第三种方法的话,就是通过给UI材质的方式,把材质的Shader改成渲染顺序在后面,并且关闭深度测试(被别的遮挡),以此来实现始终渲染在最前方。但是这个方法更多的适用于你只需要保证一个UI显示在最前方,而不在意其他UI会不会被它影响的极端情况。

另外如果使用第三种方法的UI(暂时称为A)上面有文本B的话,文本B也需要调整材质为Overlay,使其渲染顺序大于A

同理,如果需要一个UI永远渲染在最后方,可以添加关闭深度写入(遮挡别的)且Hierarchy靠前的材质。


方法看起来很简单,但是项目大了为了满足各种需求难免会出现方法混用的情况,这时候这三种顺序控制的方式很容易搅在一起形成非常古怪的效果 ,因此本文在拷打GPT后深度解析了unity的UGUI渲染顺序。

Unity 在渲染 UGUI 时:

  1. 收集所有 Canvas → 按 sortingLayer & sortingOrder 排序
  2. 对每个 Canvas 内的元素进行 Batching(合批)
  3. 再生成绘制命令 → 提交到 GPU

因为 Canvas 本身是作为渲染批次的边界,所以先后顺序受 Canvas 排序控制。另外在overlay以外的情况下UGUI(Canvas Renderer)都参与深度测试(被别的遮挡)写入深度缓冲(ZWrite Off)(遮挡别的)

CPU层管理渲染顺序: 

(1)Canvas 自身的顺序

  • 每个 Canvas 都有:

    • sortingLayer(图层)

    • sortingOrder(层内顺序)

  • 排序先按 sortingLayer(后画的图层覆盖前画的)

  • 再按 sortingOrder(数字大的后画)

如果两个 UI 元素在不同 Canvas上,那么:

  • sortingLayer 顺序决定谁先画

  • 如果 sortingLayer 相同,sortingOrder 数值大的后画 → 后画就会盖住前画

(2)同一个 Canvas 内部:

  • 按 Hierarchy 层级顺序(从上到下,越下越后渲染)

  • 添加SortingGroup排序如果它们被不同的 SortingGroup 包起来,且每个 SortingGroup 设置了不同的 sortingOrder: Unity 会把每个 SortingGroup 当成单独的渲染批次(draw call);不同组之间无法合批(在 World SpaceScreen Space - Camera + Override Sorting 时,SortingGroup 才真正控制排序)

(3)Render Queue 在 UI 下的角色

UGUI 的渲染系统会给它生成的材质(批次)加上默认的 Render Queue:

  • 通常在 Overlay(4000)队列(测试发现WorldSpace下是3000)

  • 这个 Render Queue 是系统根据 Canvas 类型决定的

  • 如果你手动改了 Shader 的 Queue,只能在 Canvas 内部影响先后顺序,但无法跨 Canvas 打破 sortingOrder 约束(因为需要合批)

也就是说:

  • 不同 Canvas:优先用 sortingLayer/sortingOrder 控制

  •  同一 Canvas 内的材质:sortingGroup管理内部合批,Render Queue 和材质顺序也会影响

GPU层像素级别决定是否渲染

因为光是谁前谁后渲染在三维空间下是无法判断出像下面这样重叠态时怎么渲染的,是白色全渲染还是红色全渲染?这时候就需要深度测试

图形渲染流水线大体是按CPU给的顺序分批次逐像素处理

顶点着色器 → 裁剪 → 光栅化 → 片元着色器 → 深度/模板测试 → 合成到帧缓冲

具体:

  1.  顶点着色器:计算模型顶点的坐标
  2.  裁剪:裁掉视锥外的部分
  3.  光栅化:把三角形拆成像素(片元)
  4.  片元着色器:对每个片元计算最终颜色,此时得到了一个片元:位置(Z)、颜色、透明度等信息
  5. 深度测试 & 模板测试(Depth & Stencil Test):对比当前片元的 Z 值和深度缓冲区已有值,根据 ZTest 设置(比如 Less)决定要不要丢弃
  6.  通过测试的片元:才写进帧缓冲(Color Buffer)和/或写进深度缓冲(Depth Buffer,取决于 ZWrite)

关键点

  • 深度测试在片元着色器之后
    → 是像素级别的决定:这个像素画不画

  • Render Queue、sortingOrder 决定什么时候发出 draw call(绘制指令)

  • 深度测试决定:这个 draw call 产生的片元,最后要不要显示

步骤做什么谁决定
收集所有要画的 Canvas根据 sortingLayer & sortingOrder 排序Unity CPU 层逻辑
按顺序提交 draw call(材质+网格)内部按 render queue 排序Unity CPU 层逻辑
GPU 渲染片元时每个像素都要经过深度测试GPU 硬件

总结

sortingOrder 和 render queue 让CPU决定谁先谁后提交 draw call;
深度测试在 GPU 上决定像素要不要画,深度测试是在「片元着色器之后」到「写入帧缓冲之前」进行的。


最后,在不考虑性能的情况下(drawcall很费性能,而一个canvas/sortingGroup会形成一个batch,batch会产生drawcall),协调各个UI顺序的邪门快捷方法是每个面板都加个canvas。

或者针对非Overlay的canvas的内部元素添加sortingGroup,调节其order in layer手动进行排序,遮挡关系一下就捋顺了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90016.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud系列(46)--SpringCloud Bus实现动态刷新全局广播

前言:上一节中我们简单的介绍了什么是SpringCloud Bus,SpringCloud Bus的用处,而本节内容则是使用SpringCloud Bus来实现动态刷新全局广播。 实现动态刷新全局广播的设计思想的架构图 注:在实现SpringCloud Bus动态刷新全局广播前…

Java+Vue开发的电子招投标管理系统,实现全流程线上操作,高效规范,助力招投标活动透明公正开展

前言: 在数字化浪潮席卷全球的当下,传统招投标模式面临着效率低下、信息不透明、管理成本高等诸多挑战。电子招投标管理系统应运而生,它借助先进的互联网技术和信息化手段,实现了招投标全流程的电子化、自动化和智能化管理。该系…

MyBatisPlus-02-核心功能

文章目录【README】【1】MyBatis-plus常见注解【2】MyBatis-Plus常见配置【2.1】MyBatis-Plus配置示例【3】MyBatisPlus核心内容【3.1】条件构造器【3.1.1】业务场景1-带多字段条件的查询-使用QueryWrapper【3.1.2】业务场景2-带条件的更新-使用QueryWrapper【3.1.3】业务场景3…

ZYNQ MPSOC GTH aurora8b10b IP的修改与仿真

1 ip设置好后的顶层模块接口: 根据自己的开发板修改接口如下: odule gtwizard_ultrascale_0_example_top (// Differential reference clock inputsinput wire mgtrefclk0_x0y1_p,input wire mgtrefclk0_x0y1_n,// Serial data ports for transceiver channel 0input w…

机器学习之线性回归

主要参考: 机器学习| 算法笔记-线性回归(Linear Regression) - 知乎 (zhihu.com) 2-2 线性回归_哔哩哔哩_bilibili Python机器学习实战:线性回归模型预测波士顿房价_哔哩哔哩_bilibili 回归分析 在数学和统计学中,回归…

Boost.Asio学习(2):同步读写

Asio 的 buffer 是什么? boost::asio::buffer(...) 是一个函数模板,用于创建一个通用的 buffer 对象,可传递给 I/O 函数(如 read, write, read_some, write_some 等)。 它返回的是 mutable_buffer 或 const_buffer 的…

Java中如何枚举正则表达式捕获组的名字

在使用正则表达式在匹配文本时&#xff0c;除了可以通过表达式捕获命中的文本串外&#xff0c;还可以对捕获的文本串进行命名。尤其是在解析日志的场景中&#xff0c;经常会被用到。表达式如下&#xff1a; \<(?<pri>\d)\>(?<time>.*) (?<host>\S)…

CentOS 系统高效部署 Dify 全攻略

系列文章目录 CentOS系统高效部署fastGPT全攻略 文章目录 系列文章目录一、前言二、准备工作与系统要求三、安装 Docker 与 Docker Compose四、部署 Dify 核心服务五、数据库与存储配置六、网络与安全优化七、监控与运维八、升级与扩展九、附录与资源关键命令速查表官方文档…

xyctf2025第三届京麒CTF

一.MISC 1.XGCTF 直接ai搜索一遍找到了出题人的博客LamentXU 2024-2025年终总结 - LamentXU - 博客园 知道了原题是ciscn中的 在LamentXU的博客乱逛Patriot CTF 2024 MISC 部分 wp - LamentXU - 博客园 找到了博客网站,让后搜索ciscn扎到了博客 CISCN华东南WEB-Polluted |…

Python爬虫 模拟登录 requests版

前言 网站必须是登录状态才能查看网站信息,是最常见的反爬手段,下面我分享一下request模拟登录状态进行请求 目录 模拟登录的原理 直接复制网站Cookie模拟登录状态 通过登录接口信息破解出Cookie模拟登录状态 模拟登录的原理 网站是使用Cookie和session记录网站的登录状态…

一些改进策略

1.要计算一个神经网络模型的总参数量、可训练参数量以及计算量&#xff08;FLOPs&#xff09;&#xff0c;可以使用以下步骤&#xff1a; ### 计算总参数量和可训练参数量&#xff1a; 1. **逐层计算参数量**&#xff1a; - 对于每一层&#xff0c;确定该层的参数量。这通…

React Native响应式布局实战:告别媒体查询,拥抱跨屏适配新时代

前言:当设计师说"这个页面要适配所有手机和平板…" “什么?React Native不支持CSS媒体查询?那怎么实现响应式布局?”——这是很多刚接触React Native的开发者会遇到的灵魂拷问。 但别慌,没有@media,我们照样能玩转多端适配!想象一下:你的App在iPhone SE的小…

[Java恶补day39] 整理模板·考点六【反转链表】

考点六【反转链表】 【考点总结】 1. 206. 【题目】 【核心思路】 【复杂度】 时间复杂度&#xff1a; O ( ) O() O()。 空间复杂度&#xff1a; O ( ) O() O()。 【代码】 92. 【题目】 【核心思路】 【复杂度】 时间复杂度&#xff1a; O ( ) O() O()。 空间复杂度&a…

7,TCP服务器

1,创建一个工程 文件目录:

Modbus_TCP_V5 新功能

odbus TCP 服务器指令 MB_SERVER V5.0 新功能概述 如下图1所示服务器指令 MB_SERVER 从 V5.0 以后增加了三个新功能&#xff0c;分别为&#xff1a; 访问数据块中的数据区域&#xff0c;而不是直接访问 MODBUS 地址过程映像区的读访问限制统计变量 NDR_immediate 和 DR_immed…

2-RuoYi-UI管理平台的启动

RuoYi-UI是RuoYi后端框架的管理中心(基于 Vue.js 的前端项目)的详细配置与启动指南,结合官方文档和常见实践整理,涵盖环境准备、配置修改、启动流程及问题排查。 ⚙️ 一、环境准备 Node.js 版本要求:≥12.0(推荐 ≥14.0 或 18.18+ 适配 Vue3) 安装后验证: node -v …

WPF学习笔记(21)ListBox、ListView与控件模板

ListBox与控件模板 一、 ListBox默认控件模板详解二、ItemsPresenter集合数据呈现1. 概述2. 示例 三、 ListView默认控件模板详解1. 概述2. 示例 一、 ListBox默认控件模板详解 WPF 中的大多数控件都有默认的控件模板。 这些模板定义了控件的默认外观和行为&#xff0c;包括控…

操作系统【2】【内存管理】【虚拟内存】【参考小林code】

本文完全参考 虚拟内存内存分段内存分页段页式内存管理Linux内存管理 一、虚拟内存 1. 单片机的绝对物理地址 以单片机作为引子&#xff0c;它没有操作系统&#xff0c;每次写完程序是借助工具将程序烧录进单片机&#xff0c;程序才能运行。 单片机由于没有操作系统&#…

【王树森推荐系统】召回05:矩阵补充、最近邻查找

概述 这节课和后面几节课将详细讲述向量召回&#xff0c;矩阵补充是向量召回最简单的一种方法&#xff0c;不过现在已经不太常用这种方法了本节课的矩阵补充是为了帮助理解下节课的双塔模型上节课介绍了embedding&#xff0c;它可以把用户ID和物品ID映射成向量 矩阵补充 模型…

C# 事件(订阅事件和触发事件)

订阅事件 订阅者向事件添加事件处理程序。对于一个要添加到事件的事件处理程序来说&#xff0c;它必须具有 与事件的委托相同的返回类型和签名。 使用运算符来为事件添加事件处理程序&#xff0c;如下面的代码所示。事件处理程序位于该运 算符的右边。事件处理程序的规范可以…