unity 烘焙场景的创建、保存和使用(附demo项目)

这是一个入门教程,demo项目:

practice4.unitypackage
https://pan.baidu.com/s/1tnDv3sDUzMlk1YnSmJV29w 密码:1234

1.打开Unity,新建一个场景

2.打开Light窗口:

如下图红框处设置参数:

 

 调整导入的模型参数:

1.导入本地materials,并apply:

 2.打勾,并apply:

 把模型拖拽到Hierarchy窗口,右键对象,点击下图方框处:

勾选对象的static属性: 

 

设置灯光的属性:

 回到Light窗口,点击按钮开始烘焙:

等待几分钟即可烘焙好:

原图:

 烘焙后效果图:

 但是这个模型只能放在当前场景使用,要想在别的场景也能使用,就需要制作预设。

首先拖拽对象到资源窗口创建预设,并给预设附一个PrefabLightmapData脚本,上面的demo项目里有,代码如下:

using UnityEngine;
using System.Collections.Generic;

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;

	void Awake() {
		if (m_RendererInfo == null || m_RendererInfo.Length == 0)
			return;

		var lightmaps = LightmapSettings.lightmaps;
		var combinedLightmaps = new LightmapData[lightmaps.Length + m_Lightmaps.Length];

		lightmaps.CopyTo(combinedLightmaps, 0);
		for (int i = 0; i < m_Lightmaps.Length; i++) {
			combinedLightmaps[i + lightmaps.Length] = new LightmapData();
			combinedLightmaps[i + lightmaps.Length].lightmapColor = m_Lightmaps[i];
		}

		ApplyRendererInfo(m_RendererInfo, lightmaps.Length);
		LightmapSettings.lightmaps = combinedLightmaps;
	}


	static void ApplyRendererInfo(RendererInfo[] infos, int lightmapOffsetIndex) {
		for (int i = 0; i < infos.Length; i++) {
			var info = infos[i];
			info.renderer.lightmapIndex = info.lightmapIndex + lightmapOffsetIndex;
			info.renderer.lightmapScaleOffset = info.lightmapOffsetScale;
		}
	}

#if UNITY_EDITOR
	[UnityEditor.MenuItem("Assets/Bake Prefab Lightmaps")]
	static void GenerateLightmapInfo() {
		if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand) {
			Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
			return;
		}
		UnityEditor.Lightmapping.Bake();

		PrefabLightmapData[] prefabs = FindObjectsOfType<PrefabLightmapData>();

		foreach (var instance in prefabs) {
			var gameObject = instance.gameObject;
			var rendererInfos = new List<RendererInfo>();
			var lightmaps = new List<Texture2D>();

			GenerateLightmapInfo(gameObject, rendererInfos, lightmaps);

			instance.m_RendererInfo = rendererInfos.ToArray();
			instance.m_Lightmaps = lightmaps.ToArray();

			var targetPrefab = UnityEditor.PrefabUtility.GetPrefabParent(gameObject) as GameObject;
			if (targetPrefab != null) {
				//UnityEditor.Prefab
				UnityEditor.PrefabUtility.ReplacePrefab(gameObject, targetPrefab);
			}
		}
	}

	static void GenerateLightmapInfo(GameObject root, List<RendererInfo> rendererInfos, List<Texture2D> lightmaps) {
		var renderers = root.GetComponentsInChildren<MeshRenderer>();
		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].lightmapColor;
				info.lightmapIndex = lightmaps.IndexOf(lightmap);
				if (info.lightmapIndex == -1) {
					info.lightmapIndex = lightmaps.Count;
					lightmaps.Add(lightmap);
				}

				rendererInfos.Add(info);
			}
		}
	}
#endif

}

 然后点击菜单栏的下图按钮:

 等待几分钟后,烘焙好了,并且这个预设保存了烘焙信息,也可以放到别的场景使用了,但是要注意的是,一个场景只能烘焙一样东西,你要是想烘焙另一个东西,就必须新建一个场景烘焙完得到预设。这是因为每次烘焙场景都生成一张烘焙图,这个图对应了场景的光照,并保存起来:

重复在一个场景烘焙,会覆盖这张图,那么原本烘焙的东西就白费了。

另外,把模型的比例调大,可以获得分辨率更加高的烘焙结果。

另外:

Lighting窗口中的Bounces的大小代表环境光在场景中的最大漫反射次数,所以这个树枝越大,没有被直接照射的部位就会越亮,阴影的轮廓也会越模糊。

 

制作完预设后,要想在别的场景使用,还需要拖拽Lighting Data 给该场景:

Lighting Data 所属文件夹的位置与scene文件在同一个子目录上:

你会发现烘焙的效果还可以和场景中的光照叠加:

效果更加逼真啦。 

 

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity场景烘焙是指为了提高游戏或VR作品的视觉效果,将场景中的光照信息预计算并储存起来的过程。通过烘焙,可以在运行时实现各种光照效果,如阴影、反射和全局光照等,提升场景的真实感和逼真度。 场景烘焙Unity中是非常重要的,因为它决定了作品的视觉表现。良好的烘焙效果可以提升用户的体验,而糟糕的烘焙效果则可能让用户对作品失去兴趣。因此,掌握烘焙技术对于使用Unity开发游戏和VR作品的从业者来说是至关重要的。 在进行场景烘焙时,有时候由于机器配置较低或者场景复杂度较高,一次性烘焙整个场景可能会消耗过多的时间和计算资源。为了解决这个问题,可以采取分步烘焙的方式,即一次只烘焙一个或一组物体。这样可以避免无缺陷物体的重复烘焙时间,并减轻机器负载。如果发现某个物体烘焙出现问题,可以将排查范围锁定在所选择的物体内,提高烘焙的效率和准确性。 总结起来,Unity场景烘焙是为了提升作品的视觉效果,在游戏和VR开发中非常重要。掌握烘焙技术可以帮助优化场景,并提供更好的用户体验。在进行烘焙时,可以采取分步烘焙的方式以提高效率和准确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Unity3d场景快速烘焙【2020】](https://blog.csdn.net/leeby100/article/details/89596950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值