【unity游戲開發——優化篇】使用Occlusion Culling遮擋剔除,只渲染相機視野內的游戲物體提升游戲性能

注意:考慮到優化的內容比較多,我將該內容分開,并全部整合放在【unity游戲開發——優化篇】專欄里,感興趣的小伙伴可以前往逐一查看學習。

文章目錄

  • 前言
  • 實戰
    • 1、確保所有靜止的3D物體都標記為`Occluder Static靜態遮擋體`和`Occludee Static靜態被遮擋體`
    • 2、然后在頂部菜單中找到`遮擋剔除`選項
    • 3、點擊“烘焙”
    • 3、若要預覽結果,請切換到可視化標簽頁
    • 4、選中攝像機調整角度查看效果
  • 補充知識
    • 1、烘焙參數介紹
    • 2、遮擋剔除
    • 3、孔洞剔除
    • 4、Occlusion Area自定義遮擋區域
    • 5、Occlusion Portal動態遮擋入口
    • 6、可移動的物體
  • 專欄推薦
  • 完結

前言

遮擋剔除是一種渲染技術,通過不繪制被其他物體遮擋的物體或者隱藏攝像機視角外的物體來提高性能。使用遮擋剔除僅渲染玩家可見部分,這非常適用于靜態關卡。

在游戲中,我們沒有必要渲染那些看不見的建筑,因為它們對你來說是沒意義的。這就是遮擋剔除發揮作用的地方了,它將場景分割成更小的部分,然后檢查給定的單元是否能被攝像機看到。如果單元可見,那么其中的物體也是可見的,如果不可見,它們都會被隱藏。

實戰

1、確保所有靜止的3D物體都標記為Occluder Static靜態遮擋體Occludee Static靜態被遮擋體

一般來說,小物體通常被用作被遮擋體,因為它們很少覆蓋其他物體。而大物體如墻壁則被用作遮擋體

注意:地面也要設置為靜態

在這里插入圖片描述

2、然后在頂部菜單中找到遮擋剔除選項

在這里插入圖片描述

3、點擊“烘焙”

在這里插入圖片描述

注意:如果上次烘培后,靜態物體發生改變,比如修改了位置,可視化效果可能會與當前烘培設置以及遮擋區域放置有出入。所以每次修改都要記得重新進行烘培。

3、若要預覽結果,請切換到可視化標簽頁

在這里插入圖片描述

4、選中攝像機調整角度查看效果

在場景視圖中,可以看到僅渲染相機能看到的內容,這能幫你很好的提升游戲性能。
在這里插入圖片描述

補充知識

1、烘焙參數介紹

在這里插入圖片描述

  • 最小遮擋物:我們可以設置打算阻擋其他物體可見性的物體的大小。所以如果我們在這里設置一個值,比如0.5。那么所有大于這個值的物體將被視為遮擋者,并隱藏其他物體。最小遮擋物也決定了單元格的大小。較小的值增加了精度,但也增大了遮擋數據的大小。
  • 最小孔:允許Unity在遮擋剔除過程中忽略非常小的洞。這避免了通過非常小的洞渲染那些遮擋物體。比如默認是0.25,也就是墻洞小于等于0.25時,會被看成是一面完整的墻進行遮擋。
  • 背面閾值:背面閾值是一項大小優化,通過視測試背面來減少不必要的細節。如果我們把背面閾值設置為100,不會移除任何背面。如果我們減小這個值,我們就可以決定一個給定單元格中背面可以占多少比例。建議把這個值保持在100,因為通常來說,有效的攝像機位置是看不到很多背面的。除非我們想要在一個非常復雜的場景中減少遮擋數據的大小,例如,位于地形下方和實體對象內部的幾何體就可以移除。

2、遮擋剔除

我們創建一個5x5x1大小的物體設置為Occluder Static靜態遮擋體,并在它后面創建一些設置為Occludee Static靜態被遮擋體的小立方體

注意:地面也要設置為靜態

在這里插入圖片描述
重新烘培發現,后面的小立方體沒有被遮擋剔除
在這里插入圖片描述
為什么呢?

因為前面我們介紹過最小遮擋物這個參數,默認它是5,那么所有大于這個值的物體才會被視為遮擋者。所以我這我們可以調小這個值,比如改成1,再次點擊烘培。

可以看到,遮擋著就起效果了
在這里插入圖片描述

注意:要記得開啟相機的遮擋剔除選項,不然可能不會有效果。雖然它默認就是開啟的,但是我感覺還是有必要提醒一下。
在這里插入圖片描述

3、孔洞剔除

我創建兩個立方體,同樣設置為Occluder Static靜態遮擋體,它們相距1米,模擬孔洞效果
在這里插入圖片描述
默認情況下,我們肯定不會剔除后面的物體,因為最小孔參數配置是0.25
在這里插入圖片描述

如果我們把這個值改成1,再進行烘培
在這里插入圖片描述
可以看到,后面的物體就被遮擋剔除了
在這里插入圖片描述

4、Occlusion Area自定義遮擋區域

添加自定義遮擋區域
在這里插入圖片描述
或者自己添加Occlusion Area組件
在這里插入圖片描述
然后我們可以設置一個區域的邊界
在這里插入圖片描述
前往烘培選項,修改參數,比如這里我修改最小遮擋物為0.1,再點擊烘培
在這里插入圖片描述
效果
在這里插入圖片描述
多虧這樣,在烘焙遮擋區域時,我們可以指定某區域被分成更小的單元格,而其他將被分成更大的單元格。通過使用遮擋區域,我們可以確定哪里精度應該更高,哪里可以更低。

如果我們沒有指定這樣的區域,而是將整個地形都分成更小的單元格,這會增加烘焙時間和遮擋數據的大小。

這在房子內部尤其有用,因為通常那里的物體比外面更多。
在這里插入圖片描述

5、Occlusion Portal動態遮擋入口

Occlusion Portal遮擋入口組件是一個特定的盒狀組件,可以標記為打開或關閉。記得添加它需要重新進行烘培生效。
在這里插入圖片描述
如果它是打開的,那么這個體積不會作為遮擋者起作用
在這里插入圖片描述
而當我們關閉它時,它就像一個遮擋者,并且可以遮擋其后的物體。
在這里插入圖片描述
它就像是動態的遮擋者,它們不能移動,但可以被打開或關閉,而且每次修改打開或關閉參數不需要重新烘培。

這在房間中有門的情況下很有用。
在這里插入圖片描述
我們希望門是遮擋者,但在打開門之后,門后面的物體都應該可見。關門關閉它,門后面的物體剔除。

我們可以通過一個簡單的腳本來實現這一點。

myOcclusionPortal.open = true;

6、可移動的物體

可移動的物體在運行時可以是遮擋者,但它不能遮擋靜態物體。(能被遮擋,但是遮擋不了別人

添加同一個腳本,控制物體往返運動

using UnityEngine;public class PingPongMovement : MonoBehaviour
{[Header("移動設置")][SerializeField] private float speed = 2f;[SerializeField] private float distance = 5f;private Vector3 startPosition;private void Start(){startPosition = transform.position;}private void Update(){// 使用PingPong函數在0到distance之間來回變化float x = Mathf.PingPong(Time.time * speed, distance);// 計算新位置transform.position = startPosition + Vector3.right * x;}
}

將腳本掛載在可移動的物體上,并標記為Occludee Static靜態被遮擋體

注意:這個動態物體只能被標記為Occludee Static靜態被遮擋體,如果標記為Occluder Static靜態遮擋體,烘培后,會出現問題,比如遮擋體移開了,但是遮擋效果還在,導致還是看不到后面的物體。所以可移動的物體設置千萬不要標記為Occluder Static靜態遮擋體

在這里插入圖片描述
運行游戲,查看效果
在這里插入圖片描述


專欄推薦

地址
【unity游戲開發入門到精通——C#篇】
【unity游戲開發入門到精通——unity通用篇】
【unity游戲開發入門到精通——unity3D篇】
【unity游戲開發入門到精通——unity2D篇】
【unity實戰】
【制作100個Unity游戲】
【推薦100個unity插件】
【實現100個unity特效】
【unity框架/工具集開發】
【unity游戲開發——模型篇】
【unity游戲開發——InputSystem】
【unity游戲開發——Animator動畫】
【unity游戲開發——UGUI】
【unity游戲開發——聯網篇】
【unity游戲開發——優化篇】
【unity游戲開發——shader篇】
【unity游戲開發——編輯器擴展】
【unity游戲開發——熱更新】
【unity游戲開發——網絡】

完結

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果學習過程中遇到任何問題,也歡迎你評論私信找我。

贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注,你的每一次支持都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤或者有更好的解決方法,也歡迎評論私信告訴我哦!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88026.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通用業務編號生成工具類(MyBatis-Plus + Spring Boot)詳解 + 3種調用方式

在企業應用開發中,我們經常需要生成類似 BZ -240704-0001 這種“業務編號”,它通常具有以下特點:前綴:代表業務類型,如 BZ 表示包裝日期:年月日格式,通常為 yyMMdd序列號:當天內遞增…

前端相關性能優化筆記

1.打開速度怎么變快 - 首屏加載優化2.再次打開速度怎么變快 - 緩存優化了3.操作怎么才順滑 - 渲染優化4.動畫怎么保證流暢 - 長任務拆分2.1 首屏加載指標細化:1.FP(First Paint 首次繪制) 2.FCP(First contentful Paint 首次內容繪制),FP 到 FCP 中間其實主要是 SPA…

7.7晚自習作業

實操作業02:Spark核心開發 作業說明 請嚴格按照步驟操作,并將最終結果文件(命名為:sparkcore_result.txt)于20點前上傳。結果文件需包含每一步的關鍵命令執行結果文本輸出。 一、數據讀取與轉換操作 上傳賬戶數據$…

手機FunASR識別SIM卡通話占用內存和運行性能分析

手機FunASR識別SIM卡通話占用內存和運行性能分析 --本地AI電話機器人 上一篇:手機無網離線使用FunASR識別SIM卡語音通話內容 下一篇:手機通話語音離線ASR識別商用和優化方向 一、前言 書接上一文《阿里FunASR本地斷網離線識別模型簡析》,…

虛幻引擎Unreal Engine5恐怖游戲設計制作教程,從入門到精通從零開始完整項目開發實戰詳細講解中英字幕

和大家分享一個以前收集的UE5虛幻引擎恐怖游戲開發教程,這是國外一個大神制作的視頻教程,教程從零開始到制作出一款完整的游戲。內容講解全面,如藍圖基礎知識講解、角色控制、高級交互系統、高級庫存系統、物品檢查、恐怖環境氛圍設計、過場動…

多人協同開發時Git使用命令

拉取倉庫代碼 # 拉取遠程倉庫至本地tar_dir路徑 git clone gitgithub.com:your-repo.git target_dir # 默認是拉取遠程master分支,下面拉取并切換到自己需要開發的分支上 # 假設自己需要開發的分支是/feature/my_branch分支 git checkout -b feature/my_branch orig…

線性表——雙向鏈表

線性表——雙向鏈表1. 雙向鏈表的實現1.1 簡單圖例1.2 結點的定義1.3 新結點的創建1.4 鏈表的初始化1.5 結點的插入1.5.1 頭部插入(頭插)1.5.2 尾部插入(尾插)1.5.3 任意位置(前)插入1.6 結點的刪除1.6.1 頭…

Java后端技術博客匯總文檔

文章目錄 前言Java后端匯總鏈接Java基礎知識點數據結構算法(Java實現)算法知識點合集算法刷題算法競賽AcWing課程藍橋杯AB組輔導課合集(更新中…) 源碼分析redission 數據庫SQL ServerMySQLRedis -Canal JUC并發編程JVMNetty日志框…

QT 菜單欄設計使用方法

目錄 常用設置函數 多個QAction的單選設置 ???????菜單相關類 ??????? 系統菜單的生成和響應 使用代碼添加系統菜單 使用UI設計器設計系統菜單 使用Qt設計及界面時,常用的兩種方式添加菜單,第一使用UI界面添加,第二種 在…

AIGC領域AI藝術,打造個性化藝術作品

AIGC領域AI藝術,打造個性化藝術作品 關鍵詞:AIGC、AI藝術、生成對抗網絡、個性化創作、深度學習、藝術風格遷移、創意計算 摘要:本文深入探討了AIGC(人工智能生成內容)在藝術創作領域的應用,重點分析了如何利用AI技術打造個性化藝術作品。文章從技術原理出發,詳細解析了生…

基于Flask+Jinja2的快捷教務系統(后端鏈接到新版正方教務系統)

快捷教務系統(Easy Educational Administration Management System, EasyEAMS) 項目簡介 EasyEAMS 是一個基于 Flask Jinja2 的現代化教務系統 Web 應用。學生可通過網頁端登錄,在線查詢個人信息、成績、課表、學業生涯、通知、選課等。系…

EDM自動化與出海獨立開發實用教程

隨著互聯網全球化發展,越來越多的獨立開發者(Indie Developer)選擇將自己的產品推向海外市場。如何高效地獲客、激活用戶、提升轉化率,成為出海過程中必須解決的問題。EDM(電子郵件營銷)自動化,…

「日拱一碼」017 深度學習常用庫——TensorFlow

目錄 基礎操作 張量操作: tf.constant 用于創建常量張量 tf.Variable 用于創建可訓練的變量張量 tf.reshape 可改變張量的形狀 tf.concat 可將多個張量沿指定維度拼接 tf.split 則可將張量沿指定維度分割 數學運算: tf.add 張量的加運算 tf.su…

ARM DStream仿真器腳本常用命令

以下是ARM DStream仿真器腳本中常用的命令及其功能分類,結合調試流程和典型應用場景整理: ?? 一、連接與初始化命令 connect 建立與目標設備的連接,需指定接口類型(如JTAG/SWD)和處理器核心。 示例:conne…

vscode 調試unity

lanch.json { “version”: “0.2.0”, “configurations”: [ { “name”: “Attach to Unity”, “type”: “vstuc”, “request”: “attach” } ] }

金融IT入門知識點

銀行金融IT核心知識點全解析:架構、技術與實踐 一、金融IT的戰略地位與行業特性 金融IT作為銀行業務的核心支撐體系,其發展水平直接決定了銀行服務的效率、安全性與創新能力。截至 2025年,中國銀行業線上化業務占比已達97%,手機銀…

C++——手撕智能指針、單例模式、線程池、String

智能指針今天我們來學習一下C中的智能指針,如果有人不知道C中的智能指針的概念的話:C智能指針是一種基于RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機制的高級內存管理工具,用于自動化…

Mybatis----留言板

基礎項目:留言板 截止到目前為止,我們已經學習了 Spring(只學習了DI)、Spring MVC、SpringBoot、Mybatis 這些知識了,已經滿足了做簡單項目的基本要求了,所以接下來我們就從0到1實現表白墻項目。 需求分析…

Web-API-day3 DOM事件進階

一、 事件流 1.事件冒泡 const fa document.querySelector(.father)const son document.querySelector(.son)document.addEventListener(click, function () {alert(我是爺爺)})fa.addEventListener(click, function () {alert(我是爸爸)})son.addEventListener(click, fun…

小波增強型KAN網絡 + SHAP可解釋性分析(Pytorch實現)

效果一覽一、傳統KAN網絡的痛點與突破 1. 傳統KAN的局限性 傳統Kolmogorov-Arnold網絡(KAN)雖在理論上有可靠的多變量函數逼近能力,但存在顯著瓶頸: 計算效率低:訓練速度慢于MLP,資源消耗大,尤其…