2012-08-18

Unity 3D 從 AssetBundle 載入 Lightmap

當場景裡的光源與模型皆靜止時,可使用 Lightmapping 預先計算光照結果,下圖為使用 Lightmap 前 (Directional Light) 及使用 Lightmap 後的差異:

All Terrain Tactical Enforcer (Directional Light)

All Terrain Tactical Enforcer (Lightmapping)

1. 製作 AssetBundle
Lightmap Bake 完成之後將 Model 打包成 AssetBundle,使用指令:
BuildPipeline.BuildAssetBundle(
    Selection.activeObject, 
    Selection.objects, 
    path, 
    BuildAssetBundleOptions.CollectDependencies | 
    BuildAssetBundleOptions.CompleteAssets
);
選擇的檔案除了 Prefab/GameObject 之外,Lightmap 圖片也要選擇:

選擇 Prefab 及 Lightmap

2. 載入 AssetBundle
載入 AssetBundle 時先設定 Lightmap 再載入 GameObject,此場景的 Lightmapping 參數如下:
Lightmapping 參數

按照當初 Lightmapping 之參數做對應的設定:
List arrld = new List();
LightmapData ld = new LightmapData();
ld.lightmapFar = 
aa.assetBundle.Load("LightmapFar-0", typeof(Texture2D)) as Texture2D;
ld.lightmapNear = 
aa.assetBundle.Load("LightmapNear-0", typeof(Texture2D)) as Texture2D;
arrld.Add(ld);
 
LightmapSettings.lightmapsMode = LightmapsMode.Dual;
LightmapSettings.lightmaps = arrld.ToArray();

再載入 GameObject :
GameObject go = GameObject.Instantiate(aa.assetBundle.Load("StaticObj", typeof(GameObject))) as GameObject;
此外慶幸的是,GameObject 之 MeshRenderer 內有關 Lightmapping 之參數在存取 AssetBundle 時皆有自動設定,不需再額外寫程式存取設定之。

程式碼可以在:https://github.com/phardera/unity3d_assetbundle_lightmap.git 取得

0 意見 :

張貼留言