问题
- 我的发光材质/着色器没有出现在光照贴图中。
- 我的发光材质/着色器有时出现有时消失。
原因
Unity需要将Emission GI标志位设置Baked(烘培),这样才能在光照贴图中包含发光材质,自定义的着色器可能没有这个标志位。
解决方案
遵循下列步骤来在光照贴图中获得发光材质:
- 确保光照贴图的UV包含在网格中。在网格导入器中使用选项“Mode > Import Settings > Generate Lightmap UV”选项来创建供光照贴图使用的第二个UV通道。
- 在“Lighting Window > Object > Important GI”中检查Important GI选项。有时候Enlighten会剔除较小对象,因为它们对于间接分辨率来说太小了。要避免在每个您需包括道光照贴图的发光的对象上实时这个行为(即发光对象)。
- 将“Emission > Global Illumination”设置为Baked。它使得发光光源从当前材质烘焙到场景中的静态光照贴图。您可以在检视面板的材质中找到这个选项。
如果您自己编写着色器,您不能从着色器代码中找到这个选项,也无法将发光光源烘培到光照贴图中。如果是这样,我们必须用代码解决这个问题:
using UnityEngine;
using UnityEditor;
public class LightMapMenu : MonoBehaviour
{
// The menu item.
//菜单项
[MenuItem ("MyCustomBake/Bake")]
static void Bake ()
{
// Find all objects with the tag <Emissive_to_baked>
//找到所有带<Emissive_to_baked>标签的
// We have to set the tag “Emissive_to_baked” on each GO to be baked.
//我们需要为每个需要烘培的上面设置“Emissive_to_baked”的标签为参加烘培
GameObject[] _emissiveObjs =GameObject.FindGameObjectsWithTag("Emissive_to_baked");
// Then, by each object, set the globalIllumiationFlags to BakedEmissive.
//然后,对于每个对象,将BakedEmissive设置上globalIllumiationFlags标识
foreach (GameObject tmpObj in _emissiveObjs)
{
Material tmpMaterial = tmpObj.GetComponent<Renderer> ().sharedMaterial;
tmpMaterial.globalIlluminationFlags = MaterialGlobalIlluminationFlags.BakedEmissive;
}
// Bake the lightmap.
//烘培光照贴图
Lightmapping.Bake ();
}
}
这个脚本会为每个标签为Emissive_to_Lightmap的对象设置Global Illumination选项为Baked。之后会执行烘培函数创建光照贴图。现在,所有事情都做完了发光光源应该出现在光照贴图上了甚至自定义的着色器也可以。
更多信息
脚本请参考:
- https://docs.unity3d.com/ScriptReference/Lightmapping.Bake.html
- https://docs.unity3d.com/ScriptReference/Material-globalIlluminationFlags.html
- https://docs.unity3d.com/ScriptReference/MaterialGlobalIlluminationFlags.html
标签系统请参考:
发光标准着色器设定请参考:
生成光照贴图UV请参考:
导入GI请参考:
对于照明和渲染(搜索关键字“Emissive Materials(发光材质)”):
评论
0 条评论
文章评论已关闭。