Unity 光照贴图切换失效的问题2018

变更光照贴图的写法

我们使用LightmapSettings.lightmaps设置场景中的光照贴图的信息。LightmapSetting的结构如下:

[NativeHeader("Runtime/Graphics/LightmapSettings.h")]
[StaticAccessor("GetLightmapSettings()")]
public sealed class LightmapSettings : Object
{
   //光照贴图
    public static LightmapData[] lightmaps { get; set; }	      
    //光照模式
    public static LightmapsMode lightmapsMode { get; set; }
    //光照探针
    public static LightProbes lightProbes { get; set; }
}	   
[NativeHeader("Runtime/Graphics/LightmapData.h")]
[UsedByNativeCode]
public sealed class LightmapData
{
    public LightmapData();
    public Texture2D lightmapColor { get; set; }
    public Texture2D lightmapDir { get; set; }
    public Texture2D shadowMask { get; set; }
}

当有多场景共存的时候,多个场景的光照贴图是依次按照顺序排在一起的。如下
在这里插入图片描述
也就是说当我们需要更改LightmapSetting.lightmaps的一部分数据时,需要重新对LightmapSetting.lightmaps复制,单独改变某一个数据(比如:LightmapSetting.lightmaps[0])是无法修正的。

public class ShadowMapTest : MonoBehaviour
{
    public Texture2D lightMap;

    private void OnGUI()
    {
        if (GUI.Button(new Rect(50,50,30,30),"切换单个图片"))
        {
           //--这种操作方式是无效的,并不会完成数据修改,虽然都是引用类型,不知道unity内部做了什么处理
            LightmapSettings.lightmaps[0].lightmapColor = lightMap;
        }
        if (GUI.Button(new Rect(50, 100, 30, 30), "全部切换"))
        {
          //--虽然只是替换第一个贴图,我们需要重新创建一个数组,然后复制,修改新数组的数据,之后赋值,
          //--光照贴图的替换才会生效
            LightmapData[] data = new LightmapData[LightmapSettings.lightmaps.Length];
            LightmapSettings.lightmaps.CopyTo(data, 0);
            data[0].lightmapColor = lightMap;
            LightmapSettings.lightmaps = data;
        }
    }
}

原因分析

为什么需要全部修改才可以替换成功,因为在底层,每次调用LightmapSettings.lightmaps的get方法,都会给我们返回一个新的数组,所以在使用时我们需要注意效率,不用额外new数组。比如下面可以进行优化

//--这是上面的切换成功的代码
if (GUI.Button(new Rect(50, 100, 30, 30), "全部切换"))
  {
        LightmapData[] data = new LightmapData[LightmapSettings.lightmaps.Length];
        LightmapSettings.lightmaps.CopyTo(data, 0);
        data[0].lightmapColor = lightMap;
        LightmapSettings.lightmaps = data;
    }
    //--更改为如下方式,可以优化
  if (GUI.Button(new Rect(50, 100, 30, 30), "全部切换"))
  {
        //--获取到这个数组,这个数组是一个新的数组,我们直接更改即可
        //--但是不能LightmapSettings.lightmaps[0].lightmapColor = lightMap这样修改,不明白为什么,从头看一遍
        LightmapData[] data = LightmapSettings.lightmaps;
        data[0].lightmapColor = lightMap;
        LightmapSettings.lightmaps = data;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘培玉--大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值