Unity光照贴图的切换,实现黑夜和白天效果

news2024/11/23 21:15:14

有这么一个需求,不能使用实时光来进行动态控制光照开关,但是又要实现白天和黑夜的效果,我的场景中有大概十几个点光源和平行光

实现步骤:

一、模型原模原样复制到另一个场景中(因为贴图只能存在于当前的场景文件夹)

二、在不同的场景中调试白天和黑夜的效果,烘焙两套贴图,注意烘焙出来的贴图有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;
  1. lightmapDatas = new LightmapData[lightmapTex.Length];:创建一个具有与 lightmapTex 数组相同长度的 LightmapData 数组 lightmapDatas
  2. LightmapData lmd = new LightmapData(); 在每次迭代中创建一个新的 LightmapData 对象 lmd
  3. lmd.lightmapColor = lightmapTex[i];:将当前迭代中的 lightmapTex 数组元素赋值给 lmdlightmapColor 属性,即设置光照贴图的颜色贴图。
  4. lmd.lightmapDir = lightmapDir[i];:将当前迭代中的 lightmapDir 数组元素赋值给 lmdlightmapDir 属性,即设置光照贴图的方向贴图。
  5. lightmapDatas[i] = lmd;:将当前迭代中的 lmd 赋值给 lightmapDatas 数组的对应索引位置,完成对 lightmapDatas 数组的填充。
  6. LightmapSettings.lightmaps = lightmapDatas; 将填充后的 lightmapDatas 数组赋值给 LightmapSettings.lightmaps,以应用新的光照贴图。

如上即可实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

618私藏好物推荐!看这份清单就够了!

又到了一年一度的618&#xff0c;相信大家的购物车已经堆得满满的&#xff0c; 部分人已经选好了自己想要的东西&#xff0c;但也有一部分人还在纠结自己到底应该买什么。今天就给大家分享我的618私藏好物&#xff0c; 如果你想在这个夏天买到自己心仪的好物&#xff0c;建议你…

IIC总线 测温度和湿度

iic.c #include "iic.h"extern void printf(const char* fmt, ...); /** 函数名 &#xff1a; delay_us* 函数功能&#xff1a;延时函数* 函数参数&#xff1a;无* 函数返回值&#xff1a;无* */ void delay_us(void) {unsigned int i 2000;while(i--); } /** 函数…

字符设备驱动的内部实现

1.inode号的功能 &#xff1a;①inode号是文件存在于文件系统的唯一标识1 ②同时也是索引当前文件的inode结构体的索引导 2.文件信息结构体&#xff1a;只要文件存在于文件系统中&#xff0c;那么内核中一定会存在一个struct inode结构体&#xff0c;这个结构体里面存放了文件…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

从redis-trib.rb到集群加减节点实战

redis-trib.rb工具介绍 redis-trib.rb是redis集群管理工具&#xff0c;可以检查集群、创建删除节点、挪key、批量下发实例命令等等。 不是没有redis-trib.rb就没有集群管理了&#xff0c;没有redis-trib.rb照样可以管理集群。redis本身就有集群相关管理命令&#xff0c;redis-…

2021年系统架构设计师考试下午案例分析真题

试题一 阅读以下关于软件架构设计与评估的叙述&#xff0c;在答题纸上回答问题1和问题2。 [说明] 某公司拟开发-套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。 该评台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&#…

“6511”成果显著,联诚发上半年表现企稳高升!

六场巡回演唱会&#xff0c;五大知名展会&#xff0c;一部爆款大电影&#xff0c;一项省级品牌荣誉。 这些关键词&#xff0c;是联诚发&#xff08;LCF&#xff09;在短短六个月内取得的各项成果的总览。 ▲联诚发LCF 公司简介 绿树阴浓夏日长&#xff0c;6月的到来也预示着阶…

让小脚本成为自己高效测试的工具(详细版)

目录 测试中会遇到的工具 测试常用的开源工具 Python 移动/UI自动化测试平台 平台需要做什么 自建需要的技术 接口测试平台 运维 Django运维部署框架 单元测试概述 什么是单元测试 单元测试什么进行&#xff1f; 单元测试由谁负责&#xff1f; 单元测试需要注意 …

opencv祛除高光

代码是直接借鉴的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客 原博客是c&#xff0c;我这边只是使用python进行翻译了一下 import cv2 import numpy as npimg cv2.imread(xxx.jpg)def highlight_remove(img):img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.floa…

java0615

01java语言背景介绍 02java语言跨平台原理 03JRE和JDK

View UI Plus (iview)表格单选实现教程

View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库&#xff0c;主要用于企业级中后台系统 View UI&#xff0c;即原先的 iView&#xff0c;从 2019 年 10 月起正式更名为 View UI&#xff0c;并使用全新的 Logo View UI Plus 实现表格单选&#xff0c;这…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置&#xff08;控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志&#xff0c;无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

Android classLoader 双亲委托 反射

双亲委托 双亲委托机制&#xff0c;就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载&#xff0c;当父加载器已经加载了该类的时候&#xff0c;没有必要子ClassLoader再加载一次。 2、安全性考虑&#xff0c;防止核心API库被随意篡改。 核心代码 pri…

CSS查缺补漏之常用长度单位(px、em、rem、%、vw/vh、vmin/vmax)

此文内容较少&#xff0c;轻轻松松掌握&#xff0c;莫要有压力~ 正如现实生活中长度具有mm、dm、cm、m等&#xff0c;在css中&#xff0c;也具备多种长度单位&#xff0c;本文对常用的几种单位进行详细举例介绍~ px&#xff1a;像素单位 初学css时&#xff0c;px单位经常被使用…

2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

一、代码结构图&#xff0c;代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

邮件触发无需代码连接维格表的方法

1.邮件触发用户使用场景&#xff1a; 公司时常会收到来自各地的合作邮件&#xff0c;为了筛选合适的合作伙伴&#xff0c;公司需要查询对方企业的基础工商信息&#xff0c;例如企业的存续状态、法人代表、注册资金等等&#xff0c;然后将查询后的信息发送至高管群里&#xff0c…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台&#xff0c;由三个开源项目Elasticsearch、Logstash和Kibana组成&#xff0c;因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…

数字安全免疫力:“关基”企业构建安全体系的通关攻略

2023年5月1日起&#xff0c;《信息安全技术 关键信息基础设施安全保护要求》&#xff08;以下简称《关基保护要求》&#xff09;正式实施&#xff0c;这是关键信息基础设施安全保护相关的首个国家标准。相对于2021年9月1日起实施的《关键信息基础设施安全保护条例》&#xff0c…

复习css样式的第1章

什么是 CSS&#xff1f; CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 三种使用 CSS 的方法 有三种插入样式表的方法&#xff1a; 外…