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

这篇具有很好参考价值的文章主要介绍了Unity光照贴图的切换,实现黑夜和白天效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

实现步骤:

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

二、在不同的场景中调试白天和黑夜的效果,烘焙两套贴图,注意烘焙出来的贴图有Dir类型也有Linght类型的

那为什么会出现如下两种类型呢?原因是当Unity完成了光照贴图的烘焙时,按照不同的设置,最多会生成三种不同的光照贴图。其中以_light结尾的是光照贴图,以_dir结尾的是平行光的方向图,以_shadowmask结尾的是ShadowMask的阴影通道图。我们暂时先只关注_light和_dir结尾的光照图

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

 三、在需要进行贴图切换的场景中,创建一个控制开关,挂载如下脚本

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,以应用新的光照贴图。

如上即可实现文章来源地址https://www.toymoban.com/news/detail-498724.html

到了这里,关于Unity光照贴图的切换,实现黑夜和白天效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity地面交互效果——2、动态法线贴图实现轨迹效果

    回到目录 Unity引擎动态法线贴图制作球滚动轨迹   大家好,我是阿赵。   之前说了一个使用局部UV采样来实现轨迹的方法。这一篇在之前的基础上,使用法线贴图进行凹凸轨迹的绘制。   先来回顾一下,上一篇最终我们已经绘制了一个轨迹的贴图   可以思考一下,

    2024年02月06日
    浏览(56)
  • Unity中对预制体烘焙光照贴图,在其他Scene中使用或者动态生成带光照贴图的预制体

    记录个人开发笔记,如果有大佬有更好的方法或者觉得我这个方法哪里有问题欢迎指正! 首先说下为什么会弄预制体烘焙光照贴图,因为项目需求需要动态生成一个房间的,因此是将房间弄成预制体,动态生成就好了,这个很简单,但是呢最后程序是在一体机中跑的,性能比

    2024年02月09日
    浏览(30)
  • Unity教程||Unity 渐进式光照贴图烘焙详解

    随着各大计算平台的算力稳步增长,特别是GPU技术的不断进化,原先可望而不可及的技术比如实时光线追踪技术开始逐步走入玩家的视野。一些先锋厂商甚至已经超出Demo的范畴,开始正式推出支持实时光追的游戏。 不过目前的实时光追技术还只能在配备了最新Nvidia RTX 20系列

    2024年02月08日
    浏览(37)
  • Unity | HDRP高清渲染管线学习笔记:Lightmapping(光照烘焙)与Lightmap(光照贴图)

    目录 相关概念 1.渐进式光照贴图烘焙 1.1 渐进式光照贴图烘焙对模型的要求 1.2 渐进式光照贴图烘焙对硬件的要求 1.3 渐进式光照贴图烘焙支持的Unity渲染管线 1.4 进行渐进式光照贴图烘焙结果 1.5 渐进式光照贴图烘焙的CPU版本和GPU版本 1.6 Lighting窗口Lightmapping Settings参数介绍

    2024年02月11日
    浏览(43)
  • CSS实现白天/夜晚模式切换

    目录 功能介绍 示例 原理 代码  优化 总结         在网页设计和用户体验中,模式切换功能是一种常见的需求。模式切换可以为用户提供不同的界面外观和布局方案,以适应其个人偏好或特定环境。在这篇博客中,我们将探索如何使用纯CSS实现一个简单的模式切换效果,

    2024年02月11日
    浏览(25)
  • Unity Lighting -- 改善场景的反射光照效果

            先来看个案例问题,下图中,苹果的反射效果看起来是很奇怪的。          在它的表面上反射了两种不同颜色的Spot Light光源,还反射了不属于室内环境的来自天空盒的光线,这是有问题的。在解决这个问题之前,我们需要知道在Unity中反射是如何工作的。      

    2024年02月14日
    浏览(34)
  • Unity 设置贴图黑色区域为透明效果

    TexstureType为默认类型 勾选 Alpha from GrayScale 勾选 Alpha Is Transparent 材质球使用默认材质 Shader选为Standard 它的Rendering Mode选择Transparent

    2024年02月15日
    浏览(33)
  • wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载带光照信息的材质文件Mtl 实现光照贴图的最简实例(十七)

    `本文主要介绍opengles 如何使用 第三方库Assimp(基于C++) 加载一个最简单的带光照信息以及纹理 的3d 立方体model,3d 立方体 model 信息存储在 cube.obj 中,光照信息以及纹理图片信息存储在cube.Mtl 材质文件中,主要是介绍如何使用Assimp 解析Mtl 文件。 软硬件环境: 硬件:PC 软件

    2024年04月14日
    浏览(26)
  • unity多个物体多种材质切换效果实现方法(方法比较笨,还有不足之处多多指导)

    多种材质切换:获取物体的MeshRenderer组件上所有的材质球,并将其存放到数组中;创建另一个数组存放需要新材质球,通过循环遍历将将需要替换的材质球存放在创建好的数组内。 比如说同时给象棋的棋盘和棋子切换不同材质,具体步骤如下: 1.分别导入棋盘、棋子模型;黑

    2024年02月17日
    浏览(33)
  • 第二十二章 光照贴图

    光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为“光照贴图”的纹理中供以后使用。光照贴图可以包含直接光照和间接光照,以及阴影效果。但是,烘焙到光照贴图中的数据无法在运行时更改,这就是为什么移动静态物体后,阴影不会跟随移动。接

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包