Unity LightmapLightProbe局部动态加载

news/2024/5/5 23:18:49/文章来源:https://blog.csdn.net/linjf520/article/details/126830475

文章目录

  • 环境
  • 原因
  • 解决方法
  • 实践
    • 场景A烘焙效果,并创建A Prefab
    • 场景B烘焙效果,并创建B Prefab
    • 单独Load A/B Prefab + 烘焙效果
    • 同时将A,B场景的内容放到同一个场景内容,同时应用不同的 lightmap 烘焙
  • 方案1 - 可以同一个场景中使用多个场景的烘焙结果
    • 优化案例
  • 方案2 - 在单个场景中使用
  • 遗留问题
  • Project
  • References


环境

Unity : 2020.3.37f1
Pipeline : BRP


原因

因为 unity 内置的 bake 系统是只能跟单个场景走的

并且,运行时,只有 active == true 的场景对象才有小

如果你当前 additve 的方式 load 了多个场景,并且每个场景都有自己的 lightmap

那么其他不是 active == true 的场景对象的 lightmap 将会失效

(我是没搞懂为何 unity 这功能不制作好一些,这个功能应该很多项目都会有使用到的)


恰好,我们项目之前加载关卡的代码不是使用 加载 scene 的方式

而是使用 加载 prefab 的方式,一个prefab 就是一个 scene 里面的内容

那么这个关卡中如果烘焙了 lightmap的话,走 加载 prefab 的话, lightmap 都会失效

所以才搞这么一出笔记


解决方法

只要通过运行时,设置好 Renderer.lightmapIndex, Renderer.lightmapScaleOffset 即可


实践


场景A烘焙效果,并创建A Prefab

在这里插入图片描述


场景B烘焙效果,并创建B Prefab

在这里插入图片描述


单独Load A/B Prefab + 烘焙效果

可以看到 SingleAPrefabScene, **SingleBPrefabScene ** 场景也有 Baked Lightmaps 的内容
在这里插入图片描述
在这里插入图片描述


同时将A,B场景的内容放到同一个场景内容,同时应用不同的 lightmap 烘焙

在这里插入图片描述


方案1 - 可以同一个场景中使用多个场景的烘焙结果

// jave.lin : 加载自定义的 lightmap 信息using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode]
public class LoadCustomLightmapInfo : MonoBehaviour
{// jave.lin : 不要使用天空和,因为这个是在运行前决定的,// 中途设置除了 camera.clearFlag 有小,其他 renderer 的 reflection 都会有问题,// 建议使用 reflection probe 来替代//public Material skyboxMat;public List<LightmapDataAndRendererBinder> lightmapDatas;public bool refreshLightmap = false;public bool updated = true;private Dictionary<int, int> lightMapIndexDict;private void Start(){refreshLightmap = false;}private void Update(){if (!updated)return;if (!refreshLightmap){refreshLightmap = true;LightmapData[] lightmaps = null;if (lightmapDatas != null){// jave.lin : 刷新映射 idxif (lightMapIndexDict == null){lightMapIndexDict = new Dictionary<int, int>();}else{lightMapIndexDict.Clear();}// jave.lin : 统计总共使用到多少个 texture 2d array的元素// 计算 light map texture 属于哪个索引,相同的索引都会放在同一个 lightmapData 中var lightmapDataCount = 0;for (int i = 0; i < lightmapDatas.Count; i++){var lightmapDataBinder = lightmapDatas[i];if (lightmapDataBinder.lightmapData.lightmapColor == null){continue;}var key = lightmapDataBinder.lightmapData.GetTex2DHashCode();if (!lightMapIndexDict.TryGetValue(key, out int lightmapDataIDX)){lightmapDataIDX = lightmapDataCount++;lightMapIndexDict[key] = lightmapDataIDX;}lightmapDataBinder.lightmapDataIndex = lightmapDataIDX;}// jave.lin : 根据统计出来的数量作为 lightmapData 的数组大小lightmaps = new LightmapData[lightmapDataCount];for (int i = 0; i < lightmapDatas.Count; i++){var lightmapDataBinder = lightmapDatas[i];var lightmapIDX = lightmapDataBinder.lightmapDataIndex;if (lightmapIDX < -1 || lightmapIDX > lightmapDataCount - 1){continue;}var lightmapData = lightmaps[lightmapIDX];if (lightmapData == null){lightmapData = new LightmapData();lightmapData.lightmapColor = lightmapDataBinder.lightmapData.lightmapColor;lightmapData.lightmapDir = lightmapDataBinder.lightmapData.lightmapDir;lightmapData.shadowMask = lightmapDataBinder.lightmapData.shadowMask;lightmaps[lightmapIDX] = lightmapData;}// 设置 renderer 的 lightmap 属性var meshRenderer = lightmapDataBinder.meshRenderer;meshRenderer.lightmapIndex = lightmapIDX;meshRenderer.lightmapScaleOffset = lightmapDataBinder.lightmapScaleOffset;//meshRenderer.scaleInLightmap = lightmapDataBinder.scaleInLightmap;//meshRenderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.BlendProbesAndSkybox;}}LightmapSettings.lightmaps = lightmaps;//RenderSettings.skybox = skyboxMat;//RenderSettings.defaultReflectionMode = UnityEngine.Rendering.DefaultReflectionMode.Skybox;}}
}

优化案例

将后续的 手动填写 LightmapDataAndRendererBinder 的方式,改用工具自动提取相关的数据即可


如果需要static batch的话,可以运行时调用 StaticBatchingUtility.Combine(parent) 来处理某个节点


方案2 - 在单个场景中使用

先在:RecordLightmapInfo2Prefab.unity 中烘焙
在这里插入图片描述
在这里插入图片描述

然后调用 RecordLightmapInfo.cs 脚本的 记录烘焙信息的功能,如下点击 RecordLightmapInfo 按钮即可
在这里插入图片描述

然后在另一个场景:Testing_Load_RecordLightmapInfo2Prefab.unity 中加载 RecordLightmapInfo2Prefab.prefab
并点击:CreateLightmapDatas 按钮即可
可以看到效果和在 RecordLightmapInfo2Prefab.unity 的效果是一致的
在这里插入图片描述


遗留问题

这种方法会导致:distance shadow mask 方式的阴影会失效


Project

  • 同时加载多个场景的烘焙内容_TestingUnityLightmapLoadByCustom_unity2020.3.37f1_BRP - 2020/09/18 23:47 版本
  • javelinlin/TestingUnityLightmapLoadByCustom - 打开场景:Testing_Load_RecordLightmapInfo2Prefab.unity 就可以查看效果

References

  • Unity Lightmap&LightProbe局部动态加载 - 这个还有加载 light probe 的,到时如果需要的时候,我们再参考这篇文章继续完善即可
  • unity动态加载Lightmap
  • 【Unity】光照贴图动态加载
  • Unity 动态加载LightMap

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

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

相关文章

DHCP Snooping原理和配置

DHCP Snooping原理和配置 基本原理配置 一、基本原理 DHCP Snooping 功能&#xff1a; 使能该技术可以防止非法用户攻击&#xff0c;使得客户端可以从合法的服务器获取IP。 过程&#xff1a;使能了DHCP Snooping的设备将用户&#xff08;DHCP客户端&#xff09;的DHCP请求报文…

C++开发笔试真题

文章目录单选1关于斐波那契数列的这段代码时间复杂度&#xff1f;(O(n))2关于Linux系统&#xff0c;描述错误的是&#xff1f;3❓输出正确的结果 94在编译系统中&#xff0c;语法分析程序输出的是—语法分析树5❓网段地址154.27.0.0的网络&#xff0c;若不做子网划分&#xff0…

C_plus_侯捷课件笔记

大气的编程 文章目录大气的编程complex例子创建一个类需要注意&#xff1a;标准库&#xff08;#include&#xff09;头文件标准形式&#xff1a;声明&#xff08;类定义&#xff09;构造函数class template (类模板)&#xff1a;操作符重载&#xff1a;reference(引用&#xff…

2W 行 | 深入理解「设计模式」

你好&#xff0c;我是悟空。 如何将设计模式运用到项目中&#xff1f;如何理解设计模式的妙用&#xff1f;如何提高代码质量&#xff1f;如何做好重构&#xff1f; 这些问题值得我们每个软件工程师去深入思考和总结。 今天推荐一本书&#xff1a;《设计模式之美》&#xff0…

【附源码】从0到1项目搭建-框架搭建(上)

前言 大家好&#xff0c;本文是基于 SpringBoot 从0搭建一个企业级开发项目&#xff0c;基于SpringBoot 的项目&#xff0c;并集成MyBatis-Plus、Druid、Logback 等主流技术。希望对大家有所帮助~ 目录前言一、概述二、创建统一的依赖管理2.1、统一的依赖管理工程创建2.2、Mave…

Java深入数组

Java深入数组 1、数组概念 数组就是存储数据长度固定的容器&#xff0c;保证多个数据的数据类型要一致。 2、数组的初始化 Java语言中数组必须先初始化才能使用&#xff0c;所谓初始化就是为数组的数组元素分配内存空间&#xff0c;并为每个数组元素赋初始值。一旦数组的初…

ELK优雅开启密码登录认证

ELK登录认证 当我们安装好ELK后&#xff0c;默认是可以直接访问到kibana的&#xff0c;可以直接查看收集到的信息&#xff0c;这样很不安全。 很多人采用的是Nginx代理来做登录验证功能&#xff0c;这也是一种实现方式&#xff0c;但是我们还有另一种更加优雅的方式&#xff0c…

Vue2.0 —— Vue.nextTick(this.$nextTick)源码探秘

Vue2.0 —— Vue.nextTick&#xff08;this.$nextTick&#xff09;源码探秘 《工欲善其事&#xff0c;必先利其器》 一、知识储备 在学习这个 API 之前&#xff0c;我们需要进行一定量的知识储备&#xff0c;并且是从最基础的开始&#xff1a; nextTick&#xff0c;译为&…

激光雷达物体检测(二):点视图检测算法

综述&#xff1a; 1.点视图&#xff1a; PointNet/PointNet&#xff0c;Point-RCNN&#xff0c;3D SSD 2.俯视图&#xff1a; VoxelNet&#xff0c;SECOND&#xff0c;PIXOR&#xff0c;AFDet 3.前视图: LaserNet&#xff0c;RangeDet 4.多视图融合&#xff1a; 俯视图…

谷粒商城 高级篇 (十九) --------- 消息队列

目录一、概述二、应用三、RabbitMQ 概念四、安装 RabbitMQ五、RabbitMQ 运行机制Exchange 类型六、RabbitMQ 整合七、RabbitMQ 消息确认机制1. ConfirmCallback2. ReturnCallback3. Ack 消息确认机制一、概述 大多应用中&#xff0c;可通过消息服务中间件来提升系统异步通信、…

python实现图像添加噪声、噪声处理、滤波器代码实现

目录 加载图像添加噪声 图像傅里叶变换和反变换并可视化 图像处理---高通滤波、低通滤波、带通滤波 低通滤波器---Butterworth低通滤波器、理想低通滤波器、高斯低通滤波器 加载图像添加噪声 高斯噪声是指它的概率密度函数服从高斯分布&#xff08;即正态分布&#xff09;…

Linux设置开机自启动Java程序--三种方式

Linux设置开机自启动Java脚本程序 缘起 公司内部的服务器中有个SpringCloud项目需要运行&#xff0c;之前都是通过nohup java-jar .. &的命令来执行的&#xff0c;但是这个cloud项目服务太多&#xff0c;手动启动太麻烦而且容易出错&#xff0c;干脆写个执行java的脚本好…

C++内存管理(每日更新)

文章目录0 概述0.1 四个层面的基本用法1 Primitives1.1 new expression1.2 delete expression1.3 调用构造函数与析构函数1.4 array new & array delete1.4.1 array new0 概述 C应用程序malloc非常重要 可以看出&#xff0c;C内存管理主要是有四个层面 0.1 四个层面的基本…

NFT重构票务系统

什么是NFT&#xff1f; NFT是运行在区块链上的一种不可分割的凭证&#xff08;Non-Fungible Token&#xff09;&#xff0c;或者称为非同质化代币。NFT目前主要用在数字艺术品的铸造、拍卖、流转&#xff0c;因为一个NFT能唯一地确定它的所有者&#xff0c;并可在链上跟踪每一…

自然语言语义分析研究进展_笔记

自然语言语义分析研究进展_笔记 词语语义分析&#xff1a;确定词语意义&#xff0c;衡量两个词之间的语义相似度或相关度; 句子语义分析&#xff1a;研究包含句义分析和句义相似度分析两方面; 文本语义分析&#xff1a;识别文本的意义、主题、类别等语义信息的过程&#xff…

使用@JsonFormat并进一步了解:格式化java.util.Date对象

Java 8 Spring Boot 2.7.3 jackson 2.13.3 -- ben发布于博客园 0、前言 开发过程中遇到问题: 前端调用接口得到的时间对象(java.util.Date)总是存在这样那样的问题。 调查后发现,可以使用 @JsonFormat注解(来自jackson依赖包)解决相关问题。 ben发布于博客园 新建spring …

区块链分叉带来的安全挑战

区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉&#xff0c;一种不支持向后兼容的软件升级方式。硬分叉是共识的分裂或者改变&#xff0c;共识就是区块链系统中各节点达成数据一致性的算法&#xff0c;正常情况下每个节点需要运行相同规则的算法&#xff0c;例如比特币…

计算机毕业设计之java+javaweb的影院管理系统-电影院管理系统

计算机毕业设计之javajavaweb的影院管理系统-电影院管理系统 项目介绍 影院的需求和管理上的不断提升,影院管理的潜力将无限扩大,影院管理系统在业界被广泛关注,本网站及对此进行总体分析,将影院信息管理的发展提供参考。影院管理系统对影院发展有着明显的带动效应,尤其对当地影…

【ManageEngine】OpManager 2022用户体验报告

关于SoftwareViews SoftwareReviews是Info-Tech Research Group的一个部门&#xff0c;是一家世界级的技术研究和咨询公司&#xff0c;拥有超过20年的基于研究的IT建议和技术实施。 SoftwareViews务实的工具和详细的客户洞察力帮助软件购买者在技术决策中取得最大成功。 Sof…

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以…