unity 烘焙 光照贴图 以及一些灯光的相关问题(二)

在上一篇了解了光照以及光照贴图的一些相关属性后,在这篇具体讲讲相关的使用,以及自己预见的一些坑。

首先还是在上一篇的场景基础上,我们隐藏Realtime和Mixed光源,只留Baked的光源用来进行场景的烘焙。在Lighting设置中,只勾选Baked GI选项,Lighting Mode选择Subtractive。取消自动烘焙Auto Generate的勾选,点击Generate Lighting,手动生成Lightmap。同时Unity会在.scene文件同级目录下生成一个和scene名相同名称的文件夹,用于存放lightmap数据。相比自动生成的情况,在Baked Lightmaps中会多出一个Lighting Data Asset的参数,对应的LightingData.asset文件用于存放一些Lighting数据。

生成好之后运行Unity,修改Baked光源发现不影响场景的显示,一切都正常。

但是,当我们把静态场景存为Prefab的时候,就会出现一些问题了。而在实际的开发中,很多情况下会把静态的场景存为Prefab用于动态的加载。

我们将测试场景的物体放在同一个根目录下,然后将其转变为Prefab,点击运行。你会发现动态物体(胶囊体)也受到了baked光源的影响,变成了红色。关闭baked光源你会发现整个场景的物体都变黑了,baked的光源效果变成了realtime。

我们随便点击一个静态物体会发现其MeshRenderer中的Lightmapping属性关联的Lightmap不见了。造成这一现象的原因是,我们生成Lightmap的时候,其对应的信息都是和场景中GameObject的唯一ID相关联。当我们将这些GameObject变为Prefab时(包括后期加载该Prefab到场景中),唯一ID发生了变化,导致信息无法正确的关联起来。

有一个解决方案是,我们创建一个组件,挂载Prefab上。在烘焙完成后,这个组件会遍历该节点下所有静态物体的MeshRenderer,存储对应的Lightmap信息。当加载该Prefab的时候,将对应的Lightmap信息重新关联到对应的MeshRenderer上,代码如下:

注:由于很多时候美术可能会在一个新的场景中设置地图,然后会设置一些环境光,Fog等信息,我们程序在别的场景加载的时候,除了对应的地图Prefab外,这些信息也应该对应的设置,所以同Lightmap一起写在了脚本中。

注:由于Terrain比较特殊,如果地图中用到的话,需要单独读取信息。

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Rendering;

/// <summary>
/// 渲染信息
/// </summary>
[System.Serializable]
public struct RendererInfo
{
    public Renderer renderer;
    public int LightmapIndex;
    public Vector4 Lightm
<think>嗯,用户的问题Unity烘焙光照贴图时模型金属材质失效的问题。我需要先理解这个问题的具体情况。根据用户提供的引用,光照贴图烘焙后可能因为各种原因出现错误,比如UV问题、设置不当或者异步加载导致的问题。但用户提到的是金属材质失效,这可能与烘焙过程中的材质属性处理有关。 首先,金属材质在Unity中通常使用Standard Shader,依赖金属度(Metallic)和平滑度(Smoothness)参数。烘焙光照贴图时,如果材质的高光或反射部分没有被正确烘焙进去,可能导致材质看起来失效。可能的原因有几个方面: 1. **光照贴图设置问题**:可能没有启用高光或金属相关光照贴图通道。在光照贴图烘焙设置中,需要确认是否包含了高光信息。查看引用[4]提到的预计算实时光照选项,如果勾选了可能导致计算量过大,影响材质表现,但用户的问题可能更相关于是否保存了正确的光照信息。 2. **材质属性未正确标记为静态**:如果模型没有被标记为静态,Unity可能不会为它烘焙光照贴图。需要确保模型设置为Contribute GI或者Static。引用[1]中提到烘焙光照贴图配合光探头使用,但非静态物体可能需要动态处理,但金属材质如果是静态物体,必须正确标记。 3. **UV2通道问题**:光照贴图使用第套UV,如果模型的UV2存在重叠或未展开,可能导致光照信息不正确。引用[2]提到UV不同导致光照图错乱,可能类似的问题影响金属材质的反射效果。 4. **Shader兼容性**:使用的Shader是否支持烘焙?Standard Shader应该支持,但如果自定义了Shader可能缺少必要的烘焙处理。需要检查材质使用的Shader是否正确,或者是否需要调整参数。 接下来,可能的解决方案包括检查光照贴图设置中的高光选项,确保材质和模型设置正确,检查UV2是否正确展开,以及验证Shader的兼容性。此外,引用[3]提到运行时切换光照贴图的方法,但用户的问题可能是在烘焙阶段,所以可能需要确保烘焙时参数正确。此外,取消预计算实时光照(如引用[4]所述)可能减少计算错误,但需看具体情况。 还需要考虑烘焙后的材质是否被正确应用,比如光照贴图是否被正确引用,或者材质是否在烘焙后覆盖了原有的金属属性。可能需要手动调整材质的属性,或者使用脚本来动态设置,如引用[3]中的方法。另外,检查烘焙后的光照贴图是否存在错误,比如黑色或异常区域,这可能表明光照信息未被正确生成。 综合这些可能性,应该逐步排查设置、UV、材质属性和Shader的问题,并参考用户提供的引用中的解决方案,比如检查资源导出设置(引用[2])、调整预计算设置(引用[4])等,来找到具体原因并解决。</think>### Unity烘焙光照贴图导致金属材质失效的原因及解决方案 #### 一、问题原因分析 1. **材质属性与光照贴图兼容性问题** Unity的金属材质(Standard Shader)依赖$Metallic$和$Smoothness$参数控制表面反射特性。若烘焙时未正确处理高光/反射通道,会导致金属感丢失[^1]。 2. **模型未正确标记为静态** 未勾选$Contribute\ GI$或$Static$选项的模型无法参与光照烘焙,导致材质无法接收烘焙结果[^2]。 3. **UV2通道错误** 光照贴图依赖第套UV坐标(UV2),若存在重叠或未正确展开,会导致金属反射信息错乱。例如: $$UV2_{max} - UV2_{min} \notin [0,1]^2$$ 4. **Shader兼容性限制** 自定义Shader可能缺少`Lightmap`相关声明,导致烘焙后金属参数失效。标准Shader应包含以下代码段: ```hlsl #ifdef LIGHTMAP_ON half4 lightmapUV : TEXCOORD1; #endif ``` #### 、解决方案步骤 1. **检查模型与材质设置** - 勾选模型Inspector面板的$Contribute\ GI$ - 在材质属性中确认$Metallic>0.5$(典型金属材质值) - 强制刷新材质:右键材质选择$Reimport$ 2. **调整光照贴图设置** - 打开$Window > Rendering > Lighting$ - 在$Lightmapping\ Settings$中启用$Baked\ Global\ Illumination$ - 勾选$Compress\ Lightmaps$防止高光数据丢失[^4] ```csharp // 代码验证光照贴图状态 Debug.Log(RenderSettings.lightmaps.Length); ``` 3. **修复UV2通道** - 在建模工具中重新展开UV2(建议使用Unwrap3D工具) - 导入设置勾选$Generate\ Lightmap\ UVs$(Unity自动生成) 4. **验证Shader兼容性** - 使用Standard Shader替代自定义Shader - 添加光照贴图混合代码: ```hlsl half4 bakedColor = tex2D(unity_Lightmap, IN.lightmapUV.xy); Albedo *= bakedColor.rgb; ``` #### 三、进阶调试方法 1. **对比测试法** 创建新场景仅包含金属材质模型,逐步添加复杂元素定位问题源[^3]。 2. **内存监控** 使用Profiler查看烘焙时的$Lightmap\ Memory$占用,异常峰值可能指示UV错误[^4]。 3. **脚本强制刷新** 运行时动态重置材质属性: ```csharp void Start() { GetComponent<Renderer>().material.SetFloat("_Metallic", 0.8f); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值