当前位置: 首页 > news >正文

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的方法

关键代码&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图&#xff1a;lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...

linux(2)用户管理

文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名&#xff0c;不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...

在鸿蒙HarmonyOS手机上安装hap应用

一、下载工具 安装hap包需要用到小工具 。 二、解压到目录后&#xff0c;进入该文件夹&#xff0c;打开命令行&#xff0c;如下图 三、将下载好的hap包放入刚才解压的文件夹内&#xff08;假设hap包文件名为app.hap&#xff09; 四、连接好手机和电脑&#xff0c;手机需要打…...

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...

工程化与框架系列(8)--持续集成实践

持续集成实践 &#x1f504; 持续集成&#xff08;Continuous Integration&#xff0c;简称CI&#xff09;是现代前端开发流程中的重要环节&#xff0c;它通过自动化构建、测试和部署&#xff0c;帮助团队更快速、更可靠地交付高质量代码。本文将详细介绍前端持续集成的实践方…...

Python核心技术,Django学习基础入门教程(附环境安装包)

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...

【Qt-信号与槽】connect函数的用法

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方…...

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...

16. LangChain实战项目2——易速鲜花内部问答系统

需求简介 易束鲜花企业内部知识库如下&#xff1a; 本实战项目设计一个内部问答系统&#xff0c;基于这些内部知识&#xff0c;回答内部员工的提问。 在前面课程的基础上&#xff0c;需要安装的依赖包如下&#xff1a; pip install docx2txt pip install qdrant-client pip i…...

一文了解Conda使用

一、Conda库频道 conda的软件频道是存储软件包的远程位置&#xff0c;当在Conda中安装软件包时&#xff0c;它会从指定的频道中下载和提取软件包。频道包含了各种软件包&#xff0c;不同的频道可能提供不同版本的软件包&#xff0c;用户可以根据需要选择适合的版本。 常见 Co…...

AI辅助学习vue第十四章

第十四章&#xff1a;技术引领与未来展望 在第十五章&#xff0c;你已经在Vue技术领域深耕许久&#xff0c;积累了丰富的经验与卓越的影响力。此时&#xff0c;你将站在行业前沿&#xff0c;引领技术走向&#xff0c;为Vue技术的未来发展开辟新道路。 1. 引领Vue技术发展方向…...

chromadb向量数据库使用 (1)

目录 完整代码代码解释 完整代码 import chromadb chroma_client chromadb.Client()collection chroma_client.create_collection(name"my_collection")collection.add(documents["This is a document about pineapple","This is a document about…...

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…...

关于大型语言模型的结构修剪

本文介绍了一种名为 **LLM-Pruner** 的方法&#xff0c;用于对大型语言模型&#xff08;LLMs&#xff09;进行结构化剪枝&#xff0c;以减少模型大小和计算需求&#xff0c;同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝&#xff0c;并…...

PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!

前言 PostgreSQL 的版本号由主要版本号和次要版本号组成。例如&#xff0c;在 10.1 中&#xff0c;10 是主要版本&#xff0c;1 是次要版本。关于更多版本的规划&#xff0c;请参考 PostgreSQL 版本路线图。 版本号规则&#xff1a; PostgreSQL 10 及以后&#xff1a;版本号…...

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...

JAVA面试常见题_基础部分_mybatis面试题

1、什么是 MyBatis&#xff1f; 答&#xff1a;MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 2、讲下 MyBatis 的缓存答 &#xff1a;MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打…...

RISC-V汇编学习(一)—— 基础认识

最近这三年的工作时间大部分的工作&#xff0c;都是基于riscv的cpu和接口ip开发适配驱动&#xff0c;时不时的就要debug测试代码&#xff0c;面对很多都是汇编&#xff0c;所以也是整理下积累的一点点笔记&#xff0c;系列博客将总结下riscv相关的内容&#xff0c;一是给有需要…...

【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题

一、问题描述&#xff1a; 在Delphi 中使用WebView2控件&#xff0c;如果预先把主界面置顶&#xff08;Self.FormStyle : fsStayOnTop;&#xff09;&#xff0c;此时&#xff0c;如果在Web页面中有使用&#xff08;<input type"file" id"fileInput" acc…...

独立开发者如何一站式管理多个AI项目的API密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何一站式管理多个AI项目的API密钥 对于独立开发者而言&#xff0c;同时维护多个AI应用项目是常态。每个项目可能对接不…...

COCO数据集到底怎么用?从PyTorch和TensorFlow加载到可视化标注的完整代码示例

COCO数据集实战指南&#xff1a;从数据加载到可视化标注的全流程解析 计算机视觉领域的研究者和开发者们&#xff0c;当你开始构建目标检测或图像分割模型时&#xff0c;COCO数据集无疑是你最重要的训练资源之一。这个由微软发起的大规模数据集已经成为行业标准&#xff0c;但许…...

AI多模型协同架构:破解单点依赖与技术主权困局

1. 这不是科幻讨论&#xff0c;而是今天必须面对的产业现实 “AI未来&#xff1a;一个巨无霸&#xff0c;还是多个巨头&#xff1f;”——这个标题乍看像科技媒体的年终圆桌话题&#xff0c;但在我过去十年跟踪AI基础设施、模型服务与企业落地的实操中&#xff0c;它早已不是假…...

RingTool:心血管信号分析与深度学习在可穿戴设备中的应用

1. RingTool工具包概述&#xff1a;心血管生理信号分析的瑞士军刀作为一名长期从事医疗健康监测系统开发的工程师&#xff0c;我见证了可穿戴设备从简单的计步器到如今能够监测多种生命体征的智能化转变。在这个过程中&#xff0c;基于光电容积图(PPG)的心血管参数监测技术扮演…...

别再让电池一天一充!用STM32F103的PWR模块,把你的物联网设备续航提升10倍

STM32F103极致低功耗实战&#xff1a;从芯片级优化到系统级策略 在智能家居传感器和便携式设备领域&#xff0c;电池续航能力直接决定了产品的用户体验和市场竞争力。我曾参与开发一款基于STM32F103的温湿度传感器&#xff0c;最初版本每天都需要充电&#xff0c;客户抱怨连连…...

港澳通行证照片怎么手机拍?2026港澳通行证照片规格要求与手机拍摄方法实测

出国、赴港澳的第一步就是办理港澳通行证&#xff0c;而一张符合规范的证件照是必不可少的。很多人都会问&#xff1a;港澳通行证照片能用手机拍吗&#xff1f;怎样才能拍出符合规范的照片&#xff1f;要不要去照相馆&#xff1f;今天就给大家详细讲解港澳通行证照片的拍摄全攻…...

银行借记卡月月有礼活动汇总(立减金达标锦囊) 解除微信支付账户限制

文章目录 引言 I 银行借记卡月月有礼活动 打开交通银行App搜索“月月有礼”参加活动 招行储蓄卡专享-月月支付抽锦鲤 浦发银行APP-“惠支付”专区-月月享十惠 II 微信支付账户限制通知 限制原因: 快进快出 提交资金来源举证资料 注意事项 III 云闪付发票抽奖 引言 【银行活动…...

怎样快速去掉照片背景?2026年AI抠图工具实测对比与使用指南

还在为复杂的照片背景发愁&#xff1f;想要快速批量处理多张照片&#xff1f;本文将带你深入了解2026年最新的照片去背景方法&#xff0c;从零基础的在线工具到专业级别的桌面软件&#xff0c;再到智能AI抠图方案&#xff0c;帮你找到最适合自己的解决方案。快速去背景的核心方…...

无人超市|基于Java+vue的无人超市管理系统(源码+数据库+文档)

无人超市管理系统 基于SprinBootvue的无人超市管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台管理员模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂…...

职场新人不会写自我介绍怎么办?AI三分钟帮你搞定,面试邀约直接翻倍!

嘿&#xff0c;各位刚踏入职场的小萌新、想跳槽但又苦于没新项目亮点的打工人&#xff01;你是不是也遇到过这种尴尬&#xff1a;辛辛苦苦写完简历&#xff0c;最后却卡在“自我介绍”或者“个人总结”那块&#xff1f; 要么就是寥寥几句套话&#xff0c;像“本人性格开朗&…...