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
英文地址,請注明出處:http://en.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;如下面的代碼所示。事件處理程序位于該運 算符的右邊。事件處理程序的規范可以…