Unity3D中LightMap动态加载

      在写这边博客之前,对光照贴图的动态加载有一点了解,一直没有自己动手去实现,然后网上百度找了一些例子去实现,但是发现好多例子都是你转载我的我转载你的,写得繁琐,没有讲明重点。

    使用光照贴图有什么好处?好处就是避免动态实时的进行光照计算,提高效率。那么如何进行LightMap的动态加载呢?

    首先,你要知道怎么去烘焙场景(自行百度),烘焙好场景后,会生成你的编辑器下生成 如下的几个文件

    其中Lightmap-0_comp_dir.png和Lightmap-0_comp_light.exr就是我们需求用到的文件。

  1. 将Lightmap-0_comp_dir.png和Lightmap-0_comp_light.exr这两个文件打包成Assetbundle。
  2. 将场景中的Capsule,Plane和Sphere添加LightMapData脚本,通过写编辑器个工具记录他们的光照贴图信息,如下图:

然后把这三个物体打包成Assetbundle。

3.把光照贴图动态加载进来,测试代码如下:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Load : MonoBehaviour
{
    private const string serverIP = "http://127.0.0.1:8001/";
    private List<string> ligthList = new List<string> { "lightmap-0_comp_light", "lightmap-0_comp_dir"};
    private List<string> gameObjectList = new List<string> { "capsule", "plane" , "sphere" };
    // Start is called before the first frame update
    private LightmapData lightmapData = new LightmapData();
    private List<LightmapData> lightmapDatas = new List<LightmapData>();
   

    private void OnGUI()
    {
        GUILayout.BeginVertical();
        if (GUILayout.Button("LoadLightMaps"))
        {
            for (int num = 0; num < ligthList.Count; num++)
            {
                StartCoroutine(LoadLightMap(serverIP, ligthList[num]));
            }
        }
        if (GUILayout.Button("SetLightMaps"))
        {
            lightmapDatas.Add(lightmapData);
            LightmapSettings.lightmaps = lightmapDatas.ToArray();
        }
        if (GUILayout.Button("LoadGameObject"))
        {
            for (int num = 0; num < gameObjectList.Count; num++)
            {
                StartCoroutine(LoadGameObject(serverIP, gameObjectList[num]));
            }
        }
        GUILayout.EndVertical();
    }

    IEnumerator LoadGameObject(string  path , string resName)
    {
        string url = string.Format("{0}{1}.unity3d" , path , resName );
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        yield return request.SendWebRequest();
        AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
        GameObject go = Instantiate(ab.LoadAsset<GameObject>(resName));
        go.isStatic = true;
        PrefabLightmapData prefabLightmapData = go.GetComponent<PrefabLightmapData>();
        if(prefabLightmapData != null)
        {
            go.GetComponent<Renderer>().lightmapIndex = prefabLightmapData.lightmapIndex;
            go.GetComponent<Renderer>().lightmapScaleOffset = prefabLightmapData.lightmapOffsetScale;
        }
      

    }
    IEnumerator LoadLightMap(string path, string resName)
    {
        string url = string.Format("{0}{1}.unity3d", path, resName);
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        yield return request.SendWebRequest();
        AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
        Texture2D texture2D = ab.LoadAsset(resName) as Texture2D;

        if (resName.Contains("dir"))
        {
            lightmapData.lightmapDir = texture2D;
        }
        else
        {
            lightmapData.lightmapColor = texture2D;
        }
    }

}

最后运行结果:

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity是一款功能强大的游戏引擎,允许开发者用脚本进行灯光贴图操作。 在Unity,灯光贴图(lightmap)是指一种预计算的技术,用于模拟光源对场景的影响。通过将灯光和阴影信息渲染到一张纹理上,然后应用到场景的物体上,可以实现更加真实的光照效果。 在使用脚本进行灯光贴图操作时,我们可以使用Unity提供的Lighting类的相关函数和属性来获取和设置灯光贴图的参数。 首先,我们可以使用Lightmapping类的静态函数之一来生成灯光贴图。例如,调用Lightmapping.BakeAsync函数可以进行异步地灯光贴图烘焙操作,该函数将会在后台进行烘焙过程,不会阻塞主线程。另外,还可以使用Lightmapping.Bake函数进行同步的灯光贴图烘焙操作。 在灯光贴图完成后,我们可以通过LightmapSettings类来获取和设置灯光贴图的参数。例如,可以使用LightmapSettings.lightmaps属性来获取当前场景的灯光贴图数组。每个灯光贴图都包含了光照信息以及阴影信息。我们可以通过修改该数组的元素来改变灯光的状态。 此外,还可以使用LightmapSettings类的其他属性和函数来进一步操作灯光贴图,如LightmapSettings.lightmapsMode用于设置灯光模式、LightmapSettings.bakedColorSpace用于设置烘焙颜色空间等。 总结起来,Unity可以通过脚本进行灯光贴图操作,通过调用Lightmapping类和LightmapSettings类的相关函数和属性,可以生成、获取和设置灯光贴图,实现更加真实的光照效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值