Unity中动态切换光照贴图的方法

关键代码: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;
    }

}

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

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

相关文章

微服务笔记 2025/2/15

微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 微服务是一种架构。 微服务是一种架构。 微服务是一种架构。 以前自己做项目最常用的架构是单体架构。单体项目不适合开发大型项目。 学习微服务技术来解…

Android 端侧运行 LLM 框架 MNN 及其应用

MNN Chat Android App - 基于 MNN 引擎的智能聊天应用 一、MNN 框架简介与工作原理1.1 什么是 MNN&#xff1f;1.2 MNN 的工作原理 二、MNN Chat Android App2.1 MNN Chat 的功能2.2 MNN Chat 的优势2.3 MNN Chat Android App 的使用 三、总结 随着移动端人工智能需求的日益增长…

基于Python 宠物用品库存管理系统开发

Python 宠物用品库存管理系统开发 一、项目背景与需求分析 在宠物行业蓬勃发展的当下&#xff0c;宠物用品店的商品种类繁多&#xff0c;库存管理变得尤为重要。为了提高管理效率、减少人为错误&#xff0c;我们可以开发一个宠物用品库存管理系统。该系统需要具备商品信息管理…

Linux---共享内存

1.ipcs命令 IPC机制是一个让人烦恼的问题&#xff1a;编写错误的程序或因为某些原因而执行失败的程序将把它的IPC资源&#xff08;如消息队列中的数据&#xff09;遗留在系统里&#xff0c;并且这些资源在程序结束后很长时间让然在系统中游荡&#xff0c;这导致对程序的新调用…

数据结构与算法:二叉树

目录 树的概念 二叉树 二叉树性质 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 二叉树节点个数 二叉树叶子节点个数 二叉树高度 二叉树第k层节点个数 二叉树查找值为x的节点 判断二叉树是否是完全二叉树 二叉树销毁 树的概念 树型结构是一类重要的非线性…

中科大计算机网络原理 1.5 Internt结构和ISP

一、互联网的层次化架构 ‌覆盖范围分层‌ ‌主干网&#xff08;Tier-1级&#xff09;‌ 国家级或行业级核心网络&#xff0c;承担跨区域数据传输和全球互联功能。例如中国的四大主干网&#xff08;ChinaNET、CERNET等&#xff09;以及跨国运营商&#xff08;如AT&T、Deuts…

AI编程界的集大成者——通义灵码AI程序员

一、引言 随着软件行业的快速发展和技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;正在成为软件开发领域的一个重要组成部分。近年来&#xff0c;越来越多的AI辅助工具被引入到开发流程中&#xff0c;旨在提高效率、减少错误并加速创新。在这样的背景下&#xff0…

GPT-4.5震撼登场,AI世界再掀波澜!(3)

GPT-4.5震撼登场&#xff0c;AI世界再掀波澜! GPT-4.5震撼登场&#xff0c;AI世界再掀波澜!(2) &#xff08;一&#xff09;伦理困境&#xff1a;如何抉择 GPT-4.5 的强大功能在为我们带来诸多便利的同时&#xff0c;也引发了一系列深刻的伦理问题&#xff0c;这些问题犹如高…

electron-builder打包时github包下载失败【解决办法】

各位朋友们&#xff0c;在使用electron开发时&#xff0c;选择了electron-builder作为编译打包工具时&#xff0c;是否经常遇到无法从github上下载依赖包问题&#xff0c;如下报错&#xff1a; Get "https://github.com/electron/electron/releases/download/v6.1.12/ele…

【Linux】命令行参数 | 环境变量(四)

目录 前言&#xff1a; 一、命令行参数&#xff1a; 1.main函数参数 2.为什么有它&#xff1f; 二、环境变量&#xff1a; 1.main函数第三个参数 2.查看shell本身环境变量 3.PATH环境变量 4.修改PATH环境变量配置文件 5.HOME环境变量 6.SHELL环境变量 7.PWD环境变…

计算机毕业设计Python+DeepSeek-R1大模型游戏推荐系统 Steam游戏推荐系统 游戏可视化 游戏数据分析(源码+文档+PPT+讲解)

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

Python实现GO鹅优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 传统BP神经网络的局限性&#xff1a;BP&#xff08;Back Propagation&#xff09;神经网络作为一种…

1.忆往昔—Java发展史

在编程世界的远古时代&#xff0c;C语言和C统治着大地&#xff0c;但它们复杂且难以驾驭。1995年5月23日&#xff0c;Java 1.0正式发布&#xff0c;它像一把神奇的钥匙&#xff0c;打开了“一次编写&#xff0c;到处运行”的大门。 早在1991年Java就已经初见雏形&#xff0c;不…

Vue+Elementui 全局配置el-table表格列宽可拖拽

1、需求分析 如何让表格列宽可以拖动 elementui的el-table如果想要列宽可以拖动的话 有一个属性叫 border 在模板里添加这个属性即可实现 但是系统里面的表格我不可能一个一个去添加border太麻烦 如果能够全局配置岂不是非常省时间吗 我们在main.js里面通过全局混入的方式来…

“Web渗透测试实战指南|BWAPP靶场全关卡通关教程(含高中低/不可能级别)从SQL注入到XSS攻击手把手教学|网络安全工程师必备技能“ 内容较长点赞收藏哟

目录 Low级别 ---A1 - Injection{注入}-- HTML Injection - Reflected (GET) HTML Injection - Reflected (POST) HTML Injection - Reflected (URL) HTML Injection - Stored (Blog) iFrame Injection LDAP Connection Settings Mail Header Injection (SMTP) OS Co…

释放 Cursor 的全部潜能:快速生成智能 Cursor Rules

释放 Cursor 的全部潜能&#xff1a;使用 PromptCoder 从 package.json 快速生成智能 Cursor Rules 我们将深入探讨如何利用您项目中的 package.json 文件&#xff0c;轻松生成 Cursor Rules&#xff0c;并通过 PromptCoder 这个强大的工具&#xff0c;快速创建高质量的 curso…

DeepSeek开源周-汇总

当 ChatGPT、Claude 这些闭源大模型严防死守技术秘密时&#xff0c;DeepSeek 却反其道而行&#xff0c;选择了全面开源&#xff0c;为整个 AI 生态注入新的活力。 在过去短短一周内&#xff0c;DeepSeek 连续在 GitHub 开源了 8 个核心技术项目&#xff0c;完成了一次震撼业界…

02内存映射与bmp解码

一、mmap 内存映射 内存映射的作用是把硬件设备的地址&#xff0c;映射到应用层的内存空间&#xff0c;这样用户就可以跨越系统层访问linux的硬件设备。 1、man 2 mmap 查看映射函数接口 NAMEmmap, munmap - map or unmap files or devices into memory映射 解除…

I2C驱动(九) -- i2c_adapter控制器驱动框架编写

相关文章 I2C驱动(一) – I2C协议 I2C驱动(二) – SMBus协议 I2C驱动(三) – 驱动中的几个重要结构 I2C驱动(四) – I2C-Tools介绍 I2C驱动(五) – 通用驱动i2c-dev.c分析 I2C驱动(六) – I2C驱动程序模型 I2C驱动(七) – 编写I2C设备驱动之i2c_driver I2C驱动(八) – 编写I2C…

分布式系统核心基石:CAP定理、BASE理论与一致性算法深度解析

一、CAP定理&#xff1a;分布式系统的设计边界 1.1 核心定义与经典三角 CAP定理&#xff08;Brewers Theorem&#xff09;指出&#xff0c;在分布式系统中&#xff0c;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&a…