【Unity3D】遮挡剔除 Occlusion

news/2025/1/7 22:02:22/

目录

一、实现方法

二、为什么遮挡剔除无效,仅有视椎体剔除生效?

三、关于Occlusion Area组件的影响

四、动态遮挡物体 Occlusion Portal


参考文档:遮挡剔除 - Unity 手册

一、实现方法

版本:Unity 2021.2.7f1c1
位于射线前创建若干个立方体,将最前面的立方体放大遮挡住后面的立方体。

打开Occlusion面板

可单独选中遮挡物:勾选Occluder Static,将其变为遮挡静态物体

其他被遮挡物体则勾选Occludee Static

然后点击Bake,之后选中Main Camera 并点击进入Visualization

勾选Occlusion culling开启遮挡剔除,就生效了。

遮挡剔除包含2个部分的剔除,1、剔除视椎体之外的物体。2、剔除被挡住的物体。

如果你所有物体都可以是遮挡物体和被遮挡物体,那么Occludee Static、Occluder Static都要勾选

注意事项:

Smallest Occluder(最小的遮挡物体大小)设置太小会导致Bake数据增大,一般设置合适的遮挡物大小即可(默认是5)
Smallest Hole(最小的洞大小):是指那种镂空物体的洞如果想看到洞背后的物体,那么这个值必须比这个洞大小要小,也就是小于这个Smallest Hole大小的洞背后的物体都会被剔除掉。
Backface Threshold:官方解释一般不要动,保持100。
        Unity 的遮挡使用数据大小优化功能,通过测试背面来减少不必要的细节。默认值 100 比较稳妥,绝不会从数据集删除背面。值 5 将基于具有可见背面的位置大幅减少数据。思路是,一般情况下,有效的摄像机位置通常不会看到太多背面;例如,地形底面的视图,或者您应该无法到达的实体对象内的视图。如果阈值低于 100,Unity 将完全从数据集删除这些区域,从而减少遮挡的数据大小。

如果想再次Bake,必须先进行Clear,再Bake 否则旧的数据会影响而出现Bug。

二、为什么遮挡剔除无效,仅有视椎体剔除生效?

这是正常的Bake生成的空间数据(八叉树空间)用于快速搜索出可视物体和不可视物体的。

可以看到粒度足够小,因为我将Smallest Occluder调整成0.5大小就能遮挡,所以它会创那么细。
如果你将这个值调到超出了最大遮挡物体的大小,比如10.

那么肯定就会导致有些不能看到的物体,被看到了,而无法实现遮挡剔除,因为蓝色立方体变大了,它就更不准确地表达出这个物体的实际可视情况。它就会出现问题,如下:

其次就是Unity的Clear和Bake,当你调整了Smallest Occluder值后去重新Clear和Bake可能会无法正确生成蓝色格子,你必须确保蓝色格子正常生成才能恢复正常的遮挡剔除,如果保证?多点几次Clear和Bake 并且不要频繁地点,它是要等待执行的。

为什么你蓝色区域正确生成了,摄像机依然无法正常遮挡剔除
因为摄像机并没有在蓝色区域空间内,无法正常执行遮挡剔除...
解决办法:在摄像机背后远处创1个立方体,同样要设置为Occludee Static或Occluder Static,然后再次Clear和Bake,保证摄像机是处于蓝色区域空间内的。如下是我创了几个在后面,实际1个就可以。
(实际上可利用Occlusion Area组件去创建正常的蓝色区域,必定包含摄像机的,下面有说明)

三、关于Occlusion Area组件的影响

 创建一个空物体,挂载Occlusion Area组件,并且该物体不能是静态的,确保勾选Is View Volume

这个区域会影响蓝色区域的生成,具体如何影响不清楚,如果你创了一个这样的物体,并且这个区域没有包含任何静态物体,那么蓝色区域会变成如下,就会导致遮挡剔除无效了一样。

你必须包含住所有的物体才正常。

关于这个组件的应用目前还未了解到,猜测是方便快速剔除某一大块区域的,也就是不局限于物体的大小去做蓝色区域,可以自定义一个整体块再去做蓝色区域,加速剔除效率?

四、动态遮挡物体 Occlusion Portal

创建一个立方体,挂载Occlusion Portal组件,取消Open勾选项【不要设置为静态物体】

然后重新Clear和Bake,这个物体就成为了动态遮挡物体,利用Open勾选项,确定是否开启遮挡,如果Open是False代表开启遮挡(关门遮挡),Open是True则关闭遮挡(开门不遮挡)

演示效果:(中间很大那块就是动态遮挡物体)

如下左图是Open为False(开启遮挡),右图是Open为True(关闭遮挡)


http://www.ppmy.cn/news/1561062.html

相关文章

贝叶斯算法详解:用概率思维解决分类难题

贝叶斯算法(Bayesian Algorithm)简介 贝叶斯算法是基于贝叶斯定理的一类机器学习方法,主要用于分类问题。它通过计算某个样本属于不同类别的概率,选取最大概率对应的类别作为预测结果。贝叶斯算法简单、高效,尤其在处…

ChatGPT最新版本“o3”的概要

o3简介 o3于2024年12月20日发布——也就是OpenAI 12天直播的最后一天。目前处于安全性测试阶段。它是o1的继任者,旨在处理更复杂的推理任务。o3特别针对数学、科学和编程等领域进行了优化。 o3在多项基准测试中表现出色。例如,在ARC-AGI基准测试中&…

C++ 日志库 spdlog 使用教程

Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog 安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297 S…

自动化删除work32挖矿脚本

work32 是一个挖矿病毒,会进入到linux服务器中挖矿,导致你的服务器很卡,删了又有,根本停不掉,那我们自动化删 #!/bin/bash# 目标进程关键词 PROCESS_NAME"work32"while true; do# 检查是否存在目标进程pid$…

MySQL数据表设计 系统权限表设计 权限、角色、用户表设计

数据库 创建 CREATE DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 修改 ALTER DATABASE my_database CHARACTER SETutf8mb4 COLLATEutf8mb4_unicode_ci; 字符集:utf8和utf8mb4,推荐使用:utf8mb4 utf8&…

ceph文件系统

ceph文件系统 ceph基础知识ceph系统的核心原理和组件1. 架构和组件1.1 Ceph Monitor (MON)1.2 Ceph OSD (Object Storage Daemon)1.3 Ceph MDS (Metadata Server)1.4 Ceph Client 2. 数据存储与分布2.1 CRUSH 算法2.2 数据副本与容错 3. 数据一致性4. pg和存储池与osd之间的关系…

掌控ctf-2月赛

没事干 随便刷刷题 1伪协议读取系统进程 源码 <?php highlight_file(__FILE__); require_once flag.php; if(isset($_GET[file])) {require_once $_GET[file]; } 伪协议读取flag.php&#xff0c;/proc/self指向当前进程的 exp ?filephp://filter/readconvert.base64…

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…