Unity光照贴图的切换,实现黑夜和白天效果
有这么一个需求,不能使用实时光来进行动态控制光照开关,但是又要实现白天和黑夜的效果,我的场景中有大概十几个点光源和平行光
实现步骤:
一、模型原模原样复制到另一个场景中(因为贴图只能存在于当前的场景文件夹)
二、在不同的场景中调试白天和黑夜的效果,烘焙两套贴图,注意烘焙出来的贴图有Dir类型也有Linght类型的
那为什么会出现如下两种类型呢?原因是当Unity完成了光照贴图的烘焙时,按照不同的设置,最多会生成三种不同的光照贴图。其中以_light结尾的是光照贴图,以_dir结尾的是平行光的方向图,以_shadowmask结尾的是ShadowMask的阴影通道图。我们暂时先只关注_light和_dir结尾的光照图
三、在需要进行贴图切换的场景中,创建一个控制开关,挂载如下脚本
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;/// <summary>
/// 该脚本用于控制光照贴图和光照开关
/// </summary>
public class LightingSwitchBtn : MonoBehaviour,IPointerClickHandler
{public bool IsTurnOn = false;public GameObject CircleSlider;// / <summary>// / 光照信息// / </summary>LightmapData[] lightmapDatas;/// <summary>/// 暗的时候的贴图/// </summary>public Texture2D[] lightmapDark;public Texture2D[] lightmapDarkDir;/// <summary>/// 亮的时候的贴图/// </summary>public Texture2D[] lightmapLight;public Texture2D[] lightmapLightDir;void Awake(){}public void OnPointerClick(PointerEventData eventData){SwichState();}public void SwichState(){bool ClickState = !IsTurnOn;if (ClickState){gameObject.GetComponent<Image>().color = Color.blue;CircleSlider.transform.DOLocalMoveX(16.7f, 0.2f);SetLightMap(lightmapLight,lightmapDarkDir);}else{gameObject.GetComponent<Image>().color = Color.white;CircleSlider.transform.DOLocalMoveX(-16.7f, 0.2f);SetLightMap(lightmapDark,lightmapDarkDir);}IsTurnOn = ClickState;}/// <summary>/// 替换所有贴图/// </summary>/// <param name="lightmapTex"></param>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;}
}
*注意这四个数组分别代表你在黑夜和白天下的贴图,分成了Dir和Light类型的,分别将我上述截图中对应类型的贴图赋值给如下数组
public Texture2D[] lightmapDark;public Texture2D[] lightmapDarkDir;public Texture2D[] lightmapLight;public Texture2D[] lightmapLightDir;
*LightmapData[] lightmapDatas是光照信息组
*解释一下如下脚本
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;
lightmapDatas = new LightmapData[lightmapTex.Length];
:创建一个具有与lightmapTex
数组相同长度的LightmapData
数组lightmapDatas
。LightmapData lmd = new LightmapData();
在每次迭代中创建一个新的LightmapData
对象lmd
lmd.lightmapColor = lightmapTex[i];
:将当前迭代中的lightmapTex
数组元素赋值给lmd
的lightmapColor
属性,即设置光照贴图的颜色贴图。lmd.lightmapDir = lightmapDir[i];
:将当前迭代中的lightmapDir
数组元素赋值给lmd
的lightmapDir
属性,即设置光照贴图的方向贴图。lightmapDatas[i] = lmd;
:将当前迭代中的lmd
赋值给lightmapDatas
数组的对应索引位置,完成对lightmapDatas
数组的填充。LightmapSettings.lightmaps = lightmapDatas;
将填充后的lightmapDatas
数组赋值给LightmapSettings.lightmaps
,以应用新的光照贴图。
如上即可实现
Unity光照贴图的切换,实现黑夜和白天效果相关推荐
- Unity教程之-Unity光照贴图Lightmapping
一直没有光照贴图的深入了解,只知道它与灯光比起可以降低drawCall,偶然看到一本外文书上有详细的资料,这里学习并分享一下,下面开始! 一:简要说明一下Unity光照贴图的概念 翻译会有各种偏差,这 ...
- Unity 光照贴图切换失效的问题2018
变更光照贴图的写法 我们使用LightmapSettings.lightmaps设置场景中的光照贴图的信息.LightmapSetting的结构如下: [NativeHeader("Runt ...
- 第二十二章 Unity 光照贴图
光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为"光照贴图"的纹理中供以后使用.光照贴图可以包含直接光照和间接光照,以及阴影效果.但是,烘焙到光照贴图中的数据无法 ...
- Unity光照贴图丢失的坑
如需转载请注明出处 最近项目出版本的时候出现了部分建筑光照贴图不正常的情况,而且仅仅是部分模型,这部分模型都是有多个场景会用到的,所以都是单独出来打包的.然后以为是模型上面的光照信息丢失了,通过测试, ...
- GraphicsLab Project之光照贴图烘焙(一)
作者:i_dovelemon 来源:CSDN 日期:2018-05-19 主题:Radiosity Algorithm, Global Illumination, Barycentric Coordi ...
- unity 烘焙 光照贴图 以及一些灯光的相关问题(一)
在做游戏场景的时候,由于一般场景大部分的物体都是静止不动的(static),如果这些物体使用实时光照的话,会有很大的性能开销,比如物体的阴影.但是由于很多情况下,场景中大部分物体的位置不会在游戏运行的 ...
- Unity项目运行时动态更新光照贴图 | LightMap
Unity项目运行时动态更新烘培的光照贴图 动态更新烘培的光照贴图 场景的物件没有发生变化(也就是说没有运行时加载在场景上的Prefab) 场景的烘培贴图已经更新,但是有些物件prefab想运行时加载 ...
- Unity教程||Unity 渐进式光照贴图烘焙详解
随着各大计算平台的算力稳步增长,特别是GPU技术的不断进化,原先可望而不可及的技术比如实时光线追踪技术开始逐步走入玩家的视野.一些先锋厂商甚至已经超出Demo的范畴,开始正式推出支持实时光追的游戏. ...
- Unity 异步使用Additive加载场景导致的光照贴图出错的坑及解决办法
Lightmap(光照贴图)是Unity里很常用的一个功能,毕竟移动设备上实时光照不靠谱,要出效果还是得烘焙.但是在使用中发现了几坑的地方,通过自己写了个两个脚本就轻松搞定,这里分享下. 坑1: 异步 ...
最新文章
- linux 端口添加地址,linux – 绑定,网络(接口)和多播地址有什么区别?
- linux nat 日志,IPtables日志管理 (记录NAT信息)
- 昆明理工大学2017计算机考研题,2017年昆明理工大学现代农业工程学院341农业知识综合三[专业硕士]之计算机网络考研题库...
- qt文件选择控件_Qt编写的项目作品2-控件属性设计器(组态)
- 孙丕恕:应把云计算大数据融在一起 降低社会运营成本
- Python精通-Python入门基础
- springboot 数据权限_13 个最火的 SpringBoot 实战开源项目推荐!总有一个适合你!...
- 十步完成windows服务的安装
- WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
- 亮点前瞻 | 首届 ServerlesssDays · China 大会议程发布
- iOS第三方库-魔窗Mlink的坑
- 【Vic的小课堂】Unity实现游戏功能(1)—矩形框选
- Micheal Nielsen's神经网络学习之三:过拟合与规范化
- python2.7 BeautifulSoup 爬QQ空间说说-含源码-第一天
- 国家开发银行广东省分行
- 记:数据库课程设计(一)
- 提取QQ游戏图标并显示
- 蓝屏信息0x0000000A、 0x00000050、 0x0000001A错误分析
- 武汉计算机软件应届毕业生工资,精打细算告诉你一个应届毕业生在武汉工资多少才能活下来(汉口物件)...
- scrcpy替换minicap
热门文章
- winxpsp2 mdac 2.8 安装问题[摘]
- Doc2Vec计算句子相似度
- C++中的取余(rem)与取模(mod), 与实现fix函数
- ios apns推送 离线锁屏语音播报
- 使用vue渲染大量数据时应该怎么优化?
- 浅谈oracle数据库隔离级别
- 研究人员为航空发动机带热障涂层火焰筒异形孔制造提供全新加工手段
- 12.mybatis核心架构原理
- 计算机运行程序时声音特别大,为什么我的电脑在运行程序的时候机箱的声音非常大?...
- 机械臂灵活工作空间初步研究