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

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;
    }

}

相关文章:

  • 京准电钟解读:为何不能用网络上的NTP时间源服务器
  • leetcode 1472. 设计浏览器历史记录 中等
  • 数据存储:一文掌握存储数据到MongoDB详解
  • 【PyTorch][chapter-33][transformer-5] MHA MQA GQA, KV-Cache
  • Sublime Text4安装、汉化
  • WordPress网站502错误全面排查与解决指南
  • prometheus部署和告警设置
  • (十)趣学设计模式 之 外观模式!
  • 【计算机网络】IP协议
  • 飞鱼科技游戏策划岗内推
  • PydanticToolsParser 工具(tool call)把 LLM 生成的文本转成结构化的数据(Pydantic 模型)过程中遇到的坑
  • 第一章 SQL简介
  • python 把数组转字符串的4种方法
  • Buildroot 添加自定义模块-内置文件到文件系统
  • ffmpeg avdevice_register_all 注册设备的作用
  • Git 分支管理
  • Java基础关键_012_包装类
  • Linux的文件与目录管理
  • Redis7——基础篇(八)
  • Visual Studio Code FAQ
  • 南京建设工程交易中心网站/广告外链平台
  • 第一推是谁做的网站/今日油价92汽油价格表
  • 快普网站怎么做采购退货/seo站长平台
  • wordpress 网页计算器/乐陵seo优化
  • 泰国一家做男模的网站/深圳网站制作
  • 网站开发设计与实现/站长之家网站查询