Unity中动态切换光照贴图LightProbe的方法
关键代码:LightmapSettings.lightmaps = lightmapDatas;
LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap
这里只操作前两张:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class LightingSwitchBtn : MonoBehaviour
{public bool IsTurnOn = false;// / 光照信息LightmapData[] lightmapDatas;/// 暗的时候的贴图public Texture2D[] lightmapDark;public Texture2D[] lightmapDarkDir;/// 亮的时候的贴图public Texture2D[] lightmapLight;public Texture2D[] lightmapLightDir;void Awake(){}public void OnPointerClick(){Debug.Log("1111");SwichState();}public void SwichState(){Debug.Log("2222");bool ClickState = !IsTurnOn;if (ClickState){SetLightMap(lightmapLight, lightmapLightDir);}else{SetLightMap(lightmapDark, lightmapDarkDir);}IsTurnOn = ClickState;}public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir){if (lightmapTex == null){return;}lightmapDatas = new LightmapData[lightmapTex.Length];for (int i = 0; i < lightmapTex.Length; i++){LightmapData lmd = new LightmapData();lmd.lightmapColor = lightmapTex[i];lmd.lightmapDir = lightmapDir[i];lightmapDatas[i] = lmd;}LightmapSettings.lightmaps = lightmapDatas;}}

更新光照贴图后,还需要更新天空球,这里以HDRP管线为例,URP和build in同理:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.UI;public class LightingSwitchBtn : MonoBehaviour
{public bool IsTurnOn = false;LightmapData[] lightmapDatas; /// 光照信息[Header("上午")] /// 亮的时候的贴图public Texture2D[] lightmapLightDir;public Texture2D[] lightmapLight;[Header("下午")] /// 暗的时候的贴图public Texture2D[] lightmapDarkDir;public Texture2D[] lightmapDark;[Header("晚上")]/// 晚上的贴图public Texture2D[] lightmapNightDir;public Texture2D[] lightmapNight;[Header("天空")]public Texture SkyAM;public Texture SkyPM;public Texture SkyNight;[Header("Volume组件")]public Volume myVolume;public Texture mySkyTex;private HDRISky hdriSky;[Range(0,1)]public float TimeSwitch = 0;#region BoolIsTurnOn// public void SwichState()// {// Debug.Log("啊啊啊");// bool ClickState = !IsTurnOn;// if (ClickState)// {// SetLightMap(lightmapLight, lightmapLightDir);// }// else// {// SetLightMap(lightmapDark, lightmapDarkDir);// }// IsTurnOn = ClickState;// }#endregion//天空切换void Awake(){VolumeProfile volumeProfile = myVolume.profile;volumeProfile.TryGet<HDRISky>(out hdriSky);mySkyTex = hdriSky.hdriSky.value;}//光照贴图切换public void AM_Time(){Debug.Log("AM");SetLightMap(lightmapLight, lightmapLightDir);hdriSky.hdriSky.value = SkyAM;}public void PM_Time(){Debug.Log("PM");SetLightMap(lightmapDark, lightmapDarkDir);hdriSky.hdriSky.value = SkyPM;}public void Night_Time(){Debug.Log("Night");SetLightMap(lightmapNight, lightmapNightDir);hdriSky.hdriSky.value = SkyNight;}public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir){if (lightmapTex == null){return;}lightmapDatas = new LightmapData[lightmapTex.Length];for (int i = 0; i < lightmapTex.Length; i++){LightmapData lmd = new LightmapData();lmd.lightmapColor = lightmapTex[i];lmd.lightmapDir = lightmapDir[i];lightmapDatas[i] = lmd;}LightmapSettings.lightmaps = lightmapDatas;}}



以上是光照贴图部分的切换,但是这样会有个问题,就是光照贴图并不会影响到新加入的模型的漫反射,因为三个时段的漫反射是由冷到暖的颜色上的变化,如果你没有更新LightProbe的信息,那么你加入的模型必定会是很突兀的,如下图所示:

很明显新加入的沙发并没有暖色调影响到它,那是因为缺少LightProbe的更新,那么如果我们想更新三个时段的LightProbe,就需要将三个时段的的LightProbe保存为Asset,然后去动态加载它;
以下是将LightProbe保存为Asset的资源脚本:
using UnityEditor;
using UnityEngine;public class LightProbeAssetCreator : EditorWindow
{[MenuItem("Assets/Create/Light Probe Asset")]static void CreateLightProbeAsset(){// 获取当前场景中的光照探针数据LightProbes lightProbes = LightmapSettings.lightProbes;// 确保光照探针对象存在if (lightProbes != null){// 创建一个新的实例并将其保存为资产LightProbes lightProbesCopy = Instantiate(lightProbes);// 将实例化的光照探针保存为新资产AssetDatabase.CreateAsset(lightProbesCopy, "Assets/Arts/Scence/LightProbe/lightProbe.asset");// 刷新 AssetDatabase,以确保资产立即出现在项目视图中AssetDatabase.SaveAssets();AssetDatabase.Refresh();// 输出成功消息Debug.Log("Light Probe Asset created at Assets/lightProbe.asset");}else{Debug.LogError("No Light Probes found in LightmapSettings.");}}
}
动态加载LightProbe资产的脚本:
//using EH;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using System.Collections.Generic;
using UnityEditor;public class LightingSwitchBtn : MonoBehaviour
{LightmapData[] lightmapDatas; /// 光照信息[Header("上午")] /// 亮的时候的贴图public Texture2D[] lightmapLightDir;public Texture2D[] lightmapLight;[Header("下午")] /// 暗的时候的贴图public Texture2D[] lightmapDarkDir;public Texture2D[] lightmapDark;[Header("晚上")]/// 晚上的贴图public Texture2D[] lightmapNightDir;public Texture2D[] lightmapNight;[Header("天空")]public Texture SkyAM;public Texture SkyPM;public Texture SkyNight;[Header("Volume组件")]public Volume myVolume;public Texture mySkyTex;private HDRISky hdriSky;[Header("直线光")]public Light RealLight;public float Temperature_AM = 5800;public float Intensity_AM = 10;[Space(10)]public float Temperature_PM = 5200;public float Intensity_PM = 20;[Space(10)]public float Temperature_Night = 7500;public float Intensity_Night = 10;[Header("RenderTex")]public RenderTexture RTX01;public RenderTexture RTX02;public Material myMat;[Range(0,1)]public float TimeSwitch = 0;[Header("漫反射(Light Probes Group)")]public LightProbes loadedLightProbes;public string assetPath_AM = "Assets/Arts/Scence/LightProbe/lightProbe_AM.asset";public string assetPath_PM = "Assets/Arts/Scence/LightProbe/lightProbe_PM.asset";public string assetPath_Night = "Assets/Arts/Scence/LightProbe/lightProbe_Night.asset";//天空切换void Awake(){//FW.Get<EffectMgr>().lightControl = this;VolumeProfile volumeProfile = myVolume.profile;volumeProfile.TryGet<HDRISky>(out hdriSky);mySkyTex = hdriSky.hdriSky.value;}//光照贴图切换public void AM_Time(){Debug.Log("AM");SetLightMap(lightmapLight, lightmapLightDir);hdriSky.hdriSky.value = SkyAM;LightDirCol(Temperature_AM,Intensity_AM);LoadLightProbe( assetPath_AM);}public void PM_Time(){Debug.Log("PM");SetLightMap(lightmapDark, lightmapDarkDir);hdriSky.hdriSky.value = SkyPM;LightDirCol(Temperature_PM,Intensity_PM);LoadLightProbe( assetPath_PM);}public void Night_Time(){Debug.Log("Night");SetLightMap(lightmapNight, lightmapNightDir);hdriSky.hdriSky.value = SkyNight;LightDirCol(Temperature_Night,Intensity_Night);LoadLightProbe( assetPath_Night);}public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir){if (lightmapTex == null){return;}lightmapDatas = new LightmapData[lightmapTex.Length];for (int i = 0; i < lightmapTex.Length; i++){LightmapData lmd = new LightmapData();lmd.lightmapColor = lightmapTex[i];lmd.lightmapDir = lightmapDir[i];lightmapDatas[i] = lmd;}LightmapSettings.lightmaps = lightmapDatas;}public void LightDirCol( float TemperatureTime , float IntensityTime){RealLight.colorTemperature = TemperatureTime;HDAdditionalLightData hdLight = RealLight.GetComponent<HDAdditionalLightData>();hdLight.intensity = IntensityTime;Debug.Log("光照强度" + RealLight.intensity);}void Update(){if (Input.GetKeyDown(KeyCode.Q)){LightDirCol(Temperature_AM,Intensity_AM);}else if (Input.GetKeyDown(KeyCode.E)){LightDirCol(Temperature_PM,Intensity_PM);}else if(Input.GetKeyDown(KeyCode.R)){LightDirCol(Temperature_Night,Intensity_Night);}}void LoadLightProbe( string assetPath){// 加载光照探针资产loadedLightProbes = AssetDatabase.LoadAssetAtPath<LightProbes>(assetPath);if (loadedLightProbes != null){LightmapSettings.lightProbes = loadedLightProbes;}else{Debug.LogError("光照探针毛都没 " + assetPath);}}
}
其中LightProbes的加载关键代码是:
void LoadLightProbe( string assetPath){// 加载光照探针资产loadedLightProbes = AssetDatabase.LoadAssetAtPath<LightProbes>(assetPath);if (loadedLightProbes != null){LightmapSettings.lightProbes = loadedLightProbes;}else{Debug.LogError("光照探针毛都没 " + assetPath);}}
完整脚本有冗余,请自行删减;
相关文章:
Unity中动态切换光照贴图LightProbe的方法
关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...
考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)
一、线性表基础概念 1.1 定义与分类 定义:线性表是由n(n≥0)个相同类型数据元素构成的有限序列,元素间呈线性关系。 分类: 顺序表:元素按逻辑顺序存储在一段连续的物理空间中(数组实现&…...
C++基础知识(七)之STL算法、智能指针、文件操作、C++异常、断言
二十一、STL算法 STL提供了很多处理容器的函数模板,它们的设计是相同的,有以下特点: 1)用迭代器表示需要处理数据的区间。 2)返回迭代器放置处理数据的结果(如果有结果)。 3)接受…...
vue3.2响应式优化
Vue 3.2 在响应式方面做了诸多优化,进一步提升了性能,下面为你详细介绍: 1. shallowReactive 和 shallowRef 的性能优势 原理:shallowReactive 和 shallowRef 是浅层响应式 API。shallowReactive 仅对对象的第一层属性进行响应式…...
【Linux】线程概念与控制
线程概念与控制 一.Linux线程概念1.什么是线程?2.分页式存储管理1.虚拟地址和页表的由来2.物理内存管理3.页表4.页目录结构5.两级页表的地址转换6.缺页中断(异常) 3.线程的优点(面试题)4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个…...
零基础学习Python之循环详解:从入门到实践_我的学习Python记录11
零基础学习Python之循环详解:从入门到实践_我的学习Python记录11 一、前言 最近我在学习Python,发现很多编程概念和用法都让我感到陌生,尤其是循环这个概念。今天,我将分享我学到的循环知识,希望能帮助到和我一样的初…...
电子电路中,正负双电源供电的需求原因
1. 允许信号双向摆动 - **交流信号的处理**:许多电路(如音频放大器、运算放大器)需要处理正负交替变化的交流信号(例如声音信号、传感器输出)。如果仅用单正电源(如12V),信号的“负…...
ROS环境搭建
ROS首次搭建环境 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好,建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...
java后端开发day26--常用API(一)
(以下内容全部来自上述课程) 1.Math 1.简单介绍 是一个帮助我们用于进行数学计算的工具类私有化构造方法,所有的方法都是静态的 2.常用方法 不要背,忘了就查文档。 3.练习题 1.判断一个数是否为质数(优化版&am…...
SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析
引言:接口测试的必要性 在微服务架构盛行的今天,SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测,使用OpenAPI规范打通测试全流程,让您的接口质量保障体系更加完备。…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
Python中文自然语言处理库SnowNLP
SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库,专为处理中文文本而设计。它受到 TextBlob 的启发,但与 TextBlob 不同的是,SnowNLP 没有使用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字…...
Linux-计算机网络.udp
1.收发函数: read()/write () ///通用文件读写,可以操作套接字。 recv(,0) /send(,0) ///TCP 常用套机字读写 recvfrom()/sendto() ///UDP 常用套接字读写 ssize_t recv(int sockfd, void *buf, size_t len, …...
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...
Docker安装Postgres_16数据库
PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统(RDBMS),以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能,适用于各种规模的应用程序; 适用传…...
VSCode 移除EmmyLua插件的红色波浪线提示
VSCode 中安装插件EmmyLua,然后打开lua文件的时候,如果lua代码引用了C#脚本的变量,经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示,这个提示看着比较烦人,我们可以通…...
快慢指针【等分链表、判断链表中是否存在环】
一、等分链表:找到链表的中间节点 Java 实现 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…...
doris:阿里云 DLF
阿里云 Data Lake Formation(DLF) 是阿里云上的统一元数据管理服务。兼容 Hive Metastore 协议。 什么是 Data Lake Formation 因此我们也可以和访问 Hive Metastore 一样,连接并访问 DLF。 连接 DLF 创建 DLF Catalog CREATE CATALOG dlf PROPERTIES ("…...
大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘
文章目录 一、架构设计深度解剖1.1 核心架构对比图谱1.2 动态MoE架构实现架构差异分析表 二、训练策略全面对比2.1 训练数据工程对比2.2 分布式训练代码对比DeepSeek混合并行实现GPT-4 Megatron实现对比 2.3 关键训练参数对比 三、性能表现多维评测3.1 基准测试全景对比3.2 推理…...
C语言基础知识02
格式化输入输出 函数名:printf() 格式控制符:%c //把数据转换成字符型 cahr %d //把数据转换为有符号十进制整型 int short %ld // long %f //把数据转成单精度浮点型 flot %d //double %s …...
Linux的进程观:简单性如何成就强大性(三)
1. 环境变量 1.1. 基本概念 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接…...
element-ui infiniteScroll 组件源码分享
简单分享 infiniteScroll 组件源码,主要有以下四个方面: 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构: 二、页面属性。 2.1 infinite-scroll-disab…...
vulnhub靶场之【digitalworld.local系列】的bravery靶机
前言 靶机:digitalworld.local-bravery,IP地址为192.168.10.8 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机采用virtualbox虚拟机,网卡都为桥接模式 这里官方给的有两种方式,…...
SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置
要想在同一个springboot项目中使用多个数据源,最主要是每个数据源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是负责对数据源进行交互的并管理链接的。 spring提供了一个注解EnableMongoRepositories 用来注释在某些路径下的MongoRepo…...
部署Joplin私有云服务器postgres版-docker compose
我曾经使用过一段时间 Joplin,官方版本是收费的,而我更倾向于将数据掌握在自己手中。因此,在多次权衡后,我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连,下面是使用 Docker Compose 配置数据库…...
C++20 标准化有符号整数:迈向更可预测的整数运算
文章目录 一、背景:为什么需要标准化?二、2 的补码:原理与优势(一)2 的补码原理(二)2 的补码的优势 三、C20 的变化:明确 2 的补码四、如何利用这一特性优化代码(一&…...
npm ERR! code 128 npm ERR! An unknown git error occurred
【问题描述】 【问题解决】 管理员运行cmd(右键window --> 选择终端管理员) 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因,这里执行npm install --registryhttps:…...
【uniapp】子组件和父组件双向绑定,vue3已废除sync写法,v-model代替
vue3已废除sync写法,v-model代替 实现state的值可以从子组件传递给父组件,也可以从父组件传递给子组件 文件地址pages/about/about.vue <template><view><button size"mini" click"clickBtn">开启{{mystate}}<…...
playbin之Source插件加载流程源码剖析
之前我们有讲解过uridecodebin的setup_source中会创建source插件,关键函数: /* create and configure an element that can handle the uri */ source gen_source_element (decoder); /** Generate and configure a source element.** Returns: (tra…...
泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全
在城市化进程加速的今天,燃气泄漏、地下管网老化等问题时刻威胁着城市安全。如何实现精准、高效的可燃气体监测,守护“城市生命线”,成为新型基础设施建设的核心课题。泵吸式激光可燃气体监测仪,以创新科技赋能安全监测࿰…...
