烘焙预制体

  1. 一般烘焙的话 预制体是没有烘培信息。可以通过添加PrefabLightmapData.cs脚本添加到需要烘焙静态(如下)的父物体上,然后通过脚本生成的菜单点击菜单栏
Paste_Image.png

Assets 下的bake prefabs lightmaps ,就可以把生成光照贴图信息赋值到PrefabLightmapData.cs上并且Apply一下保存到Prefabs。后面就可以通过预制体生成的东西就有了烘焙信息。


#if UNITY_EDITOR
using UnityEditor;
using System.IO;
#endif
using UnityEngine;
using System.Collections.Generic;
[DisallowMultipleComponent, ExecuteInEditMode]
public class PrefabLightmapData : MonoBehaviour
{
[System.Serializable]
struct RendererInfo
{
public Renderer renderer;
public int lightmapIndex;
public Vector4 lightmapOffsetScale;
}
[SerializeField]
RendererInfo[] m_RendererInfo;
[SerializeField]
Texture2D[] m_Lightmaps;
[SerializeField]
Texture2D[] m_Lightmaps2;
const string LIGHTMAP_RESOURCE_PATH = "Assets/Resources/Lightmaps/";
[System.Serializable]
struct Texture2D_Remap
{
public int originalLightmapIndex;
public Texture2D originalLightmap;
public Texture2D lightmap0;
public Texture2D lightmap1;
}
static ListsceneLightmaps = new List();
void Awake()
{
ApplyLightmaps(m_RendererInfo, m_Lightmaps, m_Lightmaps2);
}
static void ApplyLightmaps(RendererInfo[] rendererInfo, Texture2D[] lightmaps, Texture2D[] lightmaps2)
{
bool existsAlready = false;
int counter = 0;
int[] lightmapArrayOffsetIndex;
if (rendererInfo == null || rendererInfo.Length == 0)
return;
var settingslightmaps = LightmapSettings.lightmaps;
var combinedLightmaps = new List();
lightmapArrayOffsetIndex = new int[lightmaps.Length];
for (int i = 0; i < lightmaps.Length; i++)
{
existsAlready = false;
for (int j = 0; j < settingslightmaps.Length; j++)
{
if (lightmaps[i] == settingslightmaps[j].lightmapFar)
{
lightmapArrayOffsetIndex[i] = j;
existsAlready = true;
}
}
if (!existsAlready)
{
lightmapArrayOffsetIndex[i] = counter + settingslightmaps.Length;
var newLightmapData = new LightmapData();
newLightmapData.lightmapFar = lightmaps[i];
newLightmapData.lightmapNear = lightmaps2[i];
combinedLightmaps.Add(newLightmapData);
++counter;
}
}
var combinedLightmaps2 = new LightmapData[settingslightmaps.Length + counter];
settingslightmaps.CopyTo(combinedLightmaps2, 0);
if (counter > 0)
{
for (int i = 0; i < combinedLightmaps.Count; i++)
{
combinedLightmaps2[i + settingslightmaps.Length] = new LightmapData();
combinedLightmaps2[i + settingslightmaps.Length].lightmapFar = combinedLightmaps[i].lightmapFar;
combinedLightmaps2[i + settingslightmaps.Length].lightmapNear = combinedLightmaps[i].lightmapNear;
}
}
ApplyRendererInfo(rendererInfo, lightmapArrayOffsetIndex);
LightmapSettings.lightmaps = combinedLightmaps2;
}
static void ApplyRendererInfo(RendererInfo[] infos, int[] arrayOffsetIndex)
{
for (int i = 0; i < infos.Length; i++)
{
var info = infos[i];
info.renderer.lightmapIndex = arrayOffsetIndex[info.lightmapIndex];
info.renderer.lightmapScaleOffset = info.lightmapOffsetScale;
}
}
#if UNITY_EDITOR
[MenuItem("Assets/Update Scene with Prefab Lightmaps")]
static void UpdateLightmaps()
{
PrefabLightmapData[] prefabs = FindObjectsOfType();
foreach (var instance in prefabs)
{
ApplyLightmaps(instance.m_RendererInfo, instance.m_Lightmaps, instance.m_Lightmaps2);
}
Debug.Log("Prefab lightmaps updated");
}
[MenuItem("Assets/Bake Prefab Lightmaps")]
static void GenerateLightmapInfo()
{
Debug.ClearDeveloperConsole();
if (Lightmapping.giWorkflowMode != Lightmapping.GIWorkflowMode.OnDemand)
{
Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
return;
}
Lightmapping.Bake();
string lightMapPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), LIGHTMAP_RESOURCE_PATH);
if (!Directory.Exists(lightMapPath))
Directory.CreateDirectory(lightMapPath);
sceneLightmaps = new List();
//var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
var sceneName = Path.GetFileNameWithoutExtension(EditorApplication.currentScene);
var resourcePath = LIGHTMAP_RESOURCE_PATH + sceneName;
var scenePath = System.IO.Path.GetDirectoryName(EditorApplication.currentScene) + "/" + sceneName + "/";
PrefabLightmapData[] prefabs = FindObjectsOfType();
foreach (var instance in prefabs)
{
var gameObject = instance.gameObject;
var rendererInfos = new List();
var lightmaps = new List();
var lightmaps2 = new List();
GenerateLightmapInfo(scenePath, resourcePath, gameObject, rendererInfos, lightmaps, lightmaps2);
instance.m_RendererInfo = rendererInfos.ToArray();
instance.m_Lightmaps = lightmaps.ToArray();
instance.m_Lightmaps2 = lightmaps2.ToArray();
var targetPrefab = PrefabUtility.GetPrefabParent(gameObject) as GameObject;
if (targetPrefab != null)
{
//Prefab
PrefabUtility.ReplacePrefab(gameObject, targetPrefab);
}
ApplyLightmaps(instance.m_RendererInfo, instance.m_Lightmaps, instance.m_Lightmaps2);
}
Debug.Log("Update to prefab lightmaps finished");
}
static void GenerateLightmapInfo(string scenePath, string resourcePath, GameObject root, ListrendererInfos, Listlightmaps, Listlightmaps2)
{
var renderers = root.GetComponentsInChildren();
foreach (MeshRenderer renderer in renderers)
{
if (renderer.lightmapIndex != -1)
{
RendererInfo info = new RendererInfo();
info.renderer = renderer;
info.lightmapOffsetScale = renderer.lightmapScaleOffset;
Texture2D lightmap = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapFar;
Texture2D lightmap2 = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapNear;
int sceneLightmapIndex = AddLightmap(scenePath, resourcePath, renderer.lightmapIndex, lightmap, lightmap2);
info.lightmapIndex = lightmaps.IndexOf(sceneLightmaps[sceneLightmapIndex].lightmap0);
if (info.lightmapIndex == -1)
{
info.lightmapIndex = lightmaps.Count;
lightmaps.Add(sceneLightmaps[sceneLightmapIndex].lightmap0);
lightmaps2.Add(sceneLightmaps[sceneLightmapIndex].lightmap1);
}
rendererInfos.Add(info);
}
}
}
static int AddLightmap(string scenePath, string resourcePath, int originalLightmapIndex, Texture2D lightmap, Texture2D lightmap2)
{
int newIndex = -1;
for (int i = 0; i < sceneLightmaps.Count; i++)
{
if (sceneLightmaps[i].originalLightmapIndex == originalLightmapIndex)
{
return i;
}
}
if (newIndex == -1)
{
var lightmap_Remap = new Texture2D_Remap();
lightmap_Remap.originalLightmapIndex = originalLightmapIndex;
lightmap_Remap.originalLightmap = lightmap;
var filename = scenePath + "Lightmap-" + originalLightmapIndex;
lightmap_Remap.lightmap0 = GetLightmapAsset(filename + "_comp_light.exr", resourcePath + "_light", originalLightmapIndex, lightmap);
if (lightmap2 != null)
{
lightmap_Remap.lightmap1 = GetLightmapAsset(filename + "_comp_dir.exr", resourcePath + "_dir", originalLightmapIndex, lightmap2);
}
sceneLightmaps.Add(lightmap_Remap);
newIndex = sceneLightmaps.Count - 1;
}
return newIndex;
}
static Texture2D GetLightmapAsset(string filename, string resourcePath, int originalLightmapIndex, Texture2D lightmap)
{
AssetDatabase.ImportAsset(filename, ImportAssetOptions.ForceUpdate);
var importer = AssetImporter.GetAtPath(filename) as TextureImporter;
importer.isReadable = true;
AssetDatabase.ImportAsset(filename, ImportAssetOptions.ForceUpdate);
var assetLightmap = AssetDatabase.LoadAssetAtPath(filename);
var assetPath = resourcePath + "-" + originalLightmapIndex + ".asset";
var newLightmap = Instantiate(assetLightmap);
AssetDatabase.CreateAsset(newLightmap, assetPath);
newLightmap = AssetDatabase.LoadAssetAtPath(assetPath);
importer.isReadable = false;
AssetDatabase.ImportAsset(filename, ImportAssetOptions.ForceUpdate);
return newLightmap;
}
#endif
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容