Unity场景模型优化技术--LOD和OcclusionCulling

这篇具有很好参考价值的文章主要介绍了Unity场景模型优化技术--LOD和OcclusionCulling。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

occlusion culling,Unity优化,unity,游戏引擎,ar

LOD和Occlusion Culling
Lod和遮挡剔除。
Occlusion Culling:Occlusion Culling 技术是指当一个物体被其他物体遮挡住而相对当前摄像机为不可见时,可以不对其进行渲染。遮挡剔除操作在Unity引擎中并不是自动进行的,这时因为在很多情况下离摄像机较远的物体先被渲染,而靠近摄像机的物体后被渲染,从而覆盖了先前渲染的物体(这被称为重复渲染overdraw)。遮挡剔除不同于视椎体剔除(Frustum Culling)视椎体剔除只是不渲染摄像机视椎范围之外的物体,而被其他物体遮挡但依然在视椎范围之内的物体则不会被剔除。(当使用遮挡剔除功能时,视椎体剔除依然有效)
遮挡剔除:在我们的场景中,如果物体1在Camera渲染中遮挡了另一个物体2,那物体2就不会再Camera中进行渲染,虽然物体2没有在Camera中进行渲染但是在整个游戏场景中这个物体同样存在。为了优化效率,这里就需要使用遮挡剔除。
Lod: 如果一个物体离我们的Camera很远,我们自然就看不见这个物体(或者只能看见一个“小点”)。但是这个物体在场景中仍然会根据它的顶点结构进行渲染并消耗性能。这时候为了优化,如果它离我们的Camera距离很远,我们就不需要对它进行渲染,也就是Lod。
一、Occlusion Culling(遮挡剔除)
1.遮挡剔除功能在Unity中使用Occlusion Culling(遮挡剔除)组件来进行实现
首先我们需要对需要进行遮挡以及被遮挡的物体进行烘焙。
在烘焙的时候,我们需要对遮挡的物体和被遮挡的物体进行选择不同的情况不同的解决方案。(比如一个玻璃物体遮挡住了另一个物体这时我们也应该对玻璃后的物体进行渲染)
这里不考虑这种情况,直接进行烘焙。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
2.烘焙完成以后,这里我们将Occlusion Culling的属性从Edit改为Visualize来查看效果。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
3.这时无法再Camera中渲染出来的物体,在场景中也不会进行渲染。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
二、LOD技术
LOD: 即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中 所处的位置 和重要度, 决定物体渲染的资源分配 ,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
在Unity场景中,根据摄像机与模型的距离,来决定显示哪一个模型,一般距离近的时候显示高精度多细节模型,距离远的时候显示低精度低细节模型。
通过lod技术,可以轻松实现
1.不同相机的距离切换不同精度的模型;
2.可以在不同相机的距离决定模型是否渲染。
在lod技术基础上,打破静态的限制,升级动态解决方案
3.动态解决方案(LOD)
4.动态解决方案(遮挡剔除)
废话不多说,上案例 (lod组件: LOD Group):
1.不同相机的距离切换不同精度的模型。
1.1先准备3个模型(不同精度的,lz这里为了突出显示用3个不同颜色代替)。

occlusion culling,Unity优化,unity,游戏引擎,ar



 
1.2然后创建一个空物体,把这三个模型放在空物体下,并给空物体添加Lod组件:LOD Group

occlusion culling,Unity优化,unity,游戏引擎,ar

LOD Group组件中,LOD0、LOD1...到Culled之间百分比可以根据自己要求拖动调整。
点击LOD0然后在点击Add添加不同的模型。
1.3添加完成后,可以移动组件LOD Group中的相机在Scene面板中查看,也可以运行起来通过移动相机在Game视图中查看。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
2.可以在不同相机的距离决定模型是否渲染。
Lod功能,unity内置的组件也会为我们提供了一套解决方案。(LOD Group组件)
2.1 首先我们先创建一个小球,可以看见camera已经距离很远,此时只能看见一个小点。但它仍然是场景中进行了渲染。
实现LOD优化,为它添加LOD Group组件。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
其中LOD 0,LOD 1分别为Camera距离这个球的距离区域划分。
2.2 我们可以在这些相对距离区域中选择是否要在这个距离对小球渲染。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
2.3 我们在需要对小球进行渲染的距离区域中添加小球的Mesh网格信息,这样在这个Camera到小球的距离内,场景就是对小球进行渲染。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
2.4 到我们拖到LOD2的距离区域后段时,这时场景会认为小球在距离Camera这么远的距离时不需要对小球进行渲染了,则小球就没有被渲染。(只是取消了小球的渲染,并不是enable等于false,所以小球的网格信息仍然存在。)

occlusion culling,Unity优化,unity,游戏引擎,ar


 
2.5 这时如果你觉得这个距离小球还需要被渲染,你就通过Add为这个距离区域添加上小球的render。小球会被渲染出来。

occlusion culling,Unity优化,unity,游戏引擎,ar



 
2.6 如果你对这些距离区域都不是你自己想要的,你同样可以对区域进行编辑并创建新的距离区域。

occlusion culling,Unity优化,unity,游戏引擎,ar



 
2.7 运行游戏来观察效果,当小球具体我们Camera超过我们的渲染的距离区域时,小球就不会进行渲染。(尽管小球仍然在我们Camera的视野范围之内)

occlusion culling,Unity优化,unity,游戏引擎,ar


 
以上方案的缺陷。
以上完成的操作都是静态的物体,但是在我们的实际项目开发中,NPC,Monster,建筑物等都是动态生成的。这种情况肯定就无法烘焙成静态的。
3.动态解决方案(LOD)
这时我们使用脚本来控制。而LOD的核心也就是在距离远的时候将小球的MeshRender组件失活我们根据这个核心点去编写代码。
3.1 为我们的Camera添加一个LODAndOcclusionController的脚本。
完成简单的动态LOD功能。
脚本源码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LODAndOcclusionController : MonoBehaviour {

    public GameObject sphere;
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Vector3.Distance (this.transform.position, sphere.transform.position) > 5f) {
            sphere.GetComponent ().enabled = false;
        } else {
            sphere.GetComponent ().enabled = true;
        }
    }
}
3.2 将小球挂载到脚本上(sphere)

3.3 场景测试 -- 这时我们可以发现当Camera和小球的距离超过5米的时候,小球则不会进行渲染。小球是动态运动的也同样没有关系。
相机移动效果:

occlusion culling,Unity优化,unity,游戏引擎,ar

小球移动效果:

occlusion culling,Unity优化,unity,游戏引擎,ar

4.动态解决方案(遮挡剔除)
4.1 使用Ray射线来进行判断。
4.2 我们将所有需要进行遮罩剔除的物体添加Tag为Occlusion。

occlusion culling,Unity优化,unity,游戏引擎,ar


 
4.2 并为我们的Camera添加脚本。

occlusion culling,Unity优化,unity,游戏引擎,ar

代码贴上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OcclusionController : MonoBehaviour {
    private GameObject[] occlusionGameObjects;
    // Use this for initialization
    void Start () {
        occlusionGameObjects = GameObject.FindGameObjectsWithTag ("Occlusion");
    }

    // Update is called once per frame
    void Update () {
        foreach (GameObject item in occlusionGameObjects) {
        Ray ray = new Ray (this.transform.position, (item.transform.position -             transform.position));
        RaycastHit hit;
        Debug.DrawLine (transform.position, item.transform.position - transform.position, Color.red);
            if (Physics.Raycast (ray, out hit)) {
                if (hit.transform.gameObject == item) {
                    item.GetComponent ().enabled = true;
                } else {
                item.GetComponent ().enabled = false;
                }
            }
        }
    }
}
测试结果
遮挡前:

occlusion culling,Unity优化,unity,游戏引擎,ar


 
遮挡后:

occlusion culling,Unity优化,unity,游戏引擎,ar文章来源地址https://www.toymoban.com/news/detail-768432.html


 
结论:
我们的LOD以及Occlusion,都是基于GameObject的MeshRender组件来实现的。只有掌握好核心点,不让它们进行渲染,这样减少了Draw Call自然就优化了性能。(主要为什么是让MeshRender组件失活,因为我们直接把整个游戏对象都失活了,那所有的碰撞信息也全部都会失效。)
关于优化:
① 首先优化DrawCall
② 优化顶点数、面数
LOD优点:减少顶点数、面数(为了显卡)
LOD缺点:① 增加CPU计算 ② 内存占用率大(因为有3个物体,Hierarchy中的每个物体都占一块内存)
手游不需要,虚拟现实、PC需要 ( •̀ ω •́ )✧
存在面数较高物体,且有时近有时远的时候用

到了这里,关于Unity场景模型优化技术--LOD和OcclusionCulling的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 渲染效率优化 - LOD(Level of Detail)

      Level of Detail(细节层次)通常简称为LOD,是一种在计算机图形学中用于优化渲染性能的技术。简单来说,LOD是一种用于动态减少或增加物体或场景细节的方法,以便在运行时更有效地使用计算机资源。在游戏中,LOD可以在保持游戏场景的外观不变的同时,根据物体或场景

    2024年02月07日
    浏览(33)
  • Unity2020 Unity2021 场景灯光烘焙简单教程,Unity场景灯光优化, 一些简单的问题

    吃饱饭 多喝水 睡好觉 将需要烘焙的场景和不需要烘焙的场景不放到一个父物体下面 模型尽量是分开的, 烘焙很耗费时间,很吃显卡和CPU性能 将需要烘焙的场景设置为static 选择灯光,将灯光设置为bake 打开Lighting 窗口 (windows 》rendering》lighting) 烘焙,建议取消自动烘焙。

    2024年02月01日
    浏览(72)
  • UE4显示关闭模型LOD命令

    按“~”号键弹出输入框· 输入Showflag.lod 0 关闭除lod0以外的lod层级显示 输入Showflag.lod -1 Ⅹ除lod0以外的lod层级显示出来 方便批量查看资产lod0效果  

    2024年02月09日
    浏览(47)
  • Unity场景优化工具:Mesh Baker 基础教程(贴图篇)

    目录 前言 一、Mash Baker是什么? 二、使用步骤 1.打开场景 2.将Texture Baker添加到场景中 3.使用Texture Baker生成贴图集 4.烘焙新的模型并使每个模型独立 总结 模型贴图整合是3D游戏中美术资源优化的重要环节,我们通常把多个模型的贴图集成到一张2048大小的贴图集中,以达到减

    2024年02月02日
    浏览(44)
  • Unity3D:提升场景画面品质&平衡性能优化

    在日常开发中,提升场景画面品质的同时平衡性能优化一直是很重要且头疼的一部分,尤其是当场景类型不同及效果需求不一样时。 所以怎么同时提升场景画面品质和平衡性能优化呢,下面介绍一些适用度高且实用性好的设置。 介绍之前先说一下结论:怎么样才能说的上是

    2024年02月08日
    浏览(60)
  • 【半导体先进工艺制程技术系列】STI应力效应(LOD效应)

    LOD效应 对于利用STI作隔离的深亚微米CMOS工艺制程技术,STI沟槽中填充的是隔离介质氧化物,由于硅衬底和隔离介质氧化物的热力膨胀系数不同,导致STI会产生压应力挤压邻近MOS的有源区,引起器件的电参数发生变化,这种效应称为STI应力效应,也称LOD效应(Length of Diffusion

    2024年02月04日
    浏览(56)
  • 如何在unity中手写一个四叉树地形lod系统(二)

    在根据四叉树节点创建了1365个地形分块网格并保存到本地后,我们接下来要在游戏运行的过程中动态地显示所需的网格,这是最关键的一步。 如何根据摄像机位置动态地选择地形块?这其中体现了由整体到局部,从简单到复杂的原则。 0、 我们首先创建三个缓存列表。 1、

    2024年02月08日
    浏览(60)
  • Unity SRP 管线【第七讲:URP LOD实现以及Reflections反射探针】

    中文版:https://edu.uwa4d.com/lesson-detail/282/1314/0?isPreview=0 英文原版:https://catlikecoding.com/unity/tutorials/custom-srp/lod-and-reflections/ 1. 首先该组件需要将子类模型置于该组件物体子节点下 2. 可在单个LOD中设置其level的模型,并可设置它的距离范围,即可在不同距离下显示不同的模型 若

    2024年02月20日
    浏览(40)
  • three.js 场景中如何彻底删除模型和性能优化

    在three.js场景中,要彻底删除外部模型,需要执行以下几个步骤: 从场景中移除模型 你可以使用 scene.remove(model) 或者 scene.remove(model.children[0]) 将模型从场景中移除。如果是多个模型,可以用循环来处理。 移除所有材质和纹理 模型通常会包含材质和纹理,即使你把它们从场景

    2024年02月10日
    浏览(45)
  • Unity场景内模型出现粉色的处理方法

    确认是否安装了URP 或者HDRP 对于的对象使用的Shader 没有的话【使用包管理器进行安装】 1.1 查看后是URP的Shader 这里并没有现实为Hidden 或者 Error 之类的隐藏或者错误找不到字段 说明已经安装了URP包,含有对应的Shader。 这里包没有问题,跳过第二步,进入第三步 2.1 内置管线包

    2023年04月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包