1. 项目概述为什么Emission不只是“亮起来”那么简单在Unity里做项目尤其是涉及到场景氛围和光照的时候Emission自发光属性是绕不开的一个话题。很多刚接触的朋友可能会觉得这不就是让材质自己亮起来吗把颜色调亮一点勾上Emission选项物体就发光了看起来好像没什么技术含量。但如果你真这么想那可能就错过了Unity全局照明Global Illumination简称GI系统中一个极其强大的工具。我见过不少项目为了营造一个霓虹闪烁的赛博都市或者一个幽暗但自带微光的洞穴美术同学吭哧吭哧摆了一堆点光源Point Light结果运行时帧率直接掉到不忍直视。也见过一些场景静态的发光招牌明明很亮但走近的角色身上却一片漆黑光照衔接非常不自然。这些问题其实很多时候都可以通过正确理解和运用Emission属性配合全局照明来解决。Emission的核心价值在于它让物体本身成为一个“无消耗”的光源。这里的“无消耗”是打引号的它指的是在运行时一个设置了Emission的物体不像真正的动态光源如Point Light、Spotlight那样需要每帧进行昂贵的光照计算。它的光照影响是通过Unity的GI系统预先计算烘焙或通过特定算法实时GI/光照探针来模拟的。这意味着你可以用成百上千个自发光的霓虹灯管、屏幕、魔法符文来装点你的场景而无需担心性能崩溃。所以今天我们不聊那些基础的“怎么勾选Emission”而是深入实战拆解Emission在Unity全局照明体系下的三种模式Realtime, Baked, None究竟该如何选择背后的原理是什么以及如何通过它来实现那些既惊艳又高效的效果。无论你是技术美术TA还是希望提升场景品质的开发者相信这篇从实战中踩坑总结出来的经验都能给你带来直接的帮助。2. Emission与全局照明GI的核心原理拆解要玩转Emission首先得明白它和Unity全局照明GI系统是如何“握手”的。你不能把它当成一个孤立的效果它的行为完全由材质Inspector面板上那个“Global Illumination”下拉框决定。2.1 Emission的本质它不是一个Light组件这是第一个需要厘清的误区。在Unity中Light组件平行光、点光源等是直接照明源。它们的光线会直接参与场景的实时光照计算影响所有物体的漫反射、高光等。每增加一个动态Light渲染开销就会显著上升。而材质的Emission属性定义的是物体表面的自发光颜色和强度。它本身不直接发射光线去照亮别人。它的光照影响力需要借助GI系统来“传递”。你可以把它理解为一块本身就很亮的“荧光板”或者“LED屏幕”。这块板子自己能被人看见但它能不能照亮旁边的墙壁和角色取决于GI系统的设置。2.2 Global Illumination的三种模式详解材质Emission属性下的Global Illumination选项就是控制这块“荧光板”如何与GI系统协作的开关。三种模式的选择直接决定了你的发光物体是“只亮自己”还是“也能照亮世界”以及性能开销如何。2.2.1 Realtime实时全局光照原理当选择Realtime模式时该材质的自发光数据会被纳入Unity的实时全局光照计算。目前这主要指的是Enlighten旧版或GPU Lightmapper渐进式光照贴图的实时更新部分或者更常见的是通过光照探针Light Probes来影响动态物体。对静态物体的影响如果场景使用了实时GI现已不推荐性能开销大这些发光体可以作为间接光源实时影响其他静态物体的光照贴图。但在当前主流的烘焙工作流中这个选项主要作用于动态物体。对动态物体的影响这是Realtime模式最主要的价值。Unity会为这些自发光物体生成光照探针数据。动态物体如玩家角色、NPC在靠近这些发光体时其身上的光照探针采样会捕捉到自发光带来的颜色和亮度影响从而实现被“照亮”的效果。这个过程是实时的动态物体移动时光照效果会平滑变化。实战场景游戏中的动态发光体比如玩家手持的火把、可移动的魔法光球、闪烁的警报灯。这些物体本身会移动并且需要实时照亮周围移动的角色和物体。注意Realtime模式并不意味着它是“零成本”的。生成和更新包含自发光信息的光照探针需要一定的计算和存储开销。如果一个巨大的自发光物体在快速移动可能会导致探针数据需要频繁更新影响性能。通常我们将其用于中小型、运动相对缓慢或范围固定的动态发光源。2.2.2 Baked烘焙全局光照原理这是最常用、最高效的模式。选择Baked后该材质的自发光效果会在你烘焙光照贴图Lightmapping时被计算并“固化”到静态物体的光照贴图中。对静态物体的影响发光体照亮周围静态物体的效果包括颜色溢出、阴影会被完美地烘焙到光照贴图里。渲染时这部分光照信息是直接从贴图中读取的没有任何运行时计算开销。你可以获得非常高质量、丰富的间接光照效果。对动态物体的影响关键点来了烘焙的光照贴图只对标记为Static的物体生效。动态物体无法从这张“烘焙好的照片”里获取光照。但是动态物体可以通过光照探针来获取环境光照信息。当你烘焙光照时Unity也会烘焙光照探针。这些探针会捕获场景中的烘焙光照包括烘焙的自发光间接光。所以动态物体站在一个烘焙了自发光的霓虹灯旁时依然能被照亮但这个照亮的光源信息是来自“预先计算好并存储在探针里”的并非实时计算发光体本身。实战场景场景中所有静态的发光体比如墙壁上的霓虹灯管、固定的电脑屏幕、天花板上的灯带、不会移动的法阵符文。这些物体的光照效果一旦烘焙就一劳永逸运行时性能极佳。2.2.3 None无原理顾名思义选择None意味着这个自发光材质完全不会参与任何全局光照计算。它不会影响光照贴图也不会影响光照探针。效果物体自身会显示Emission的颜色看起来是亮的。但它不会照亮场景中的任何其他物体无论是静态的还是动态的。它就像一个在黑暗中只照亮自己的“幽灵”。用途这种模式通常用于一些需要完全自控的视觉效果。比如某些全屏后期特效的遮罩、UI元素虽然UI通常不用标准材质、或者一些你明确希望它“只可见不参与光照”的特定道具。在性能敏感的场景中如果某个发光体确实不需要产生光照影响设为None可以节省一点点GI相关的资源。2.3 HDR颜色与强度控制发光的“能量”在Emission的Color选择器里你会发现它可以切换到HDR高动态范围模式。这是另一个实战关键点。在普通的LDR低动态范围颜色中RGB值被限制在0到1之间。但在真实世界中光源的亮度可以远超显示设备能呈现的“白色”1,1,1。HDR颜色允许你设置超过1的强度值Intensity。为什么需要HDR为了让自发光在GI计算中具有合理的“光照能量”。一个100瓦的灯泡和一个10瓦的LED灯在屏幕上可能都是“白色”但前者照亮房间的能力远大于后者。在GI计算尤其是烘焙时你需要用超过1的强度值来模拟这种差异。一个强度为5的自发光体其产生的间接光照强度会比强度为1的强得多颜色溢出也更明显。如何设置在HDR颜色拾取器中除了调整颜色重点看Intensity滑块或直接输入框。你可以将其理解为光源的“瓦数”。对于像日光灯、窗户这类主要光源强度可能需要设置到3-5甚至更高对于装饰性的微弱光源可能1-2就够了。一个实用的技巧在烘焙前将场景视图的灯光模式切换到“Baked Global Illumination”预览可以直观地看到不同强度自发光对场景的照亮效果避免盲目猜测。3. 实战应用场景与配置策略理解了原理我们把它应用到具体的项目需求中。不同的场景目标决定了完全不同的Emission配置策略。3.1 场景一静态室内场景——烘焙为王假设你在制作一个温馨的咖啡馆室内场景。里面有吊灯、壁灯、台灯都是静态模型以及发光的菜单牌。模型与材质准备为所有灯罩、灯泡、菜单牌的发光部分创建独立的材质并设置Emission颜色。吊灯和壁灯的光源通常是暖黄色RGB约 255 220 180强度Intensity根据灯泡瓦数模拟比如主吊灯设为3壁灯设为2。菜单牌可能是冷白色强度为1.5。全局光照设置在Window Rendering Lighting中将Lighting Mode设置为Baked Global Illumination。确保场景中的主要静态光源如Directional Light模拟日光也设置为Baked模式。材质GI模式将所有静态发光材质的Global Illumination属性设置为Baked。物体静态标记确保所有墙壁、地板、桌椅、以及这些发光物体本身都将Static复选框勾选或至少勾选Contribute GI。烘焙点击Generate Lighting按钮开始烘焙。烘焙完成后你会看到灯光的效果被完美地“画”在了墙壁和地面上包括自发光材质产生的柔和光晕和颜色溢出。动态物体如顾客角色通过光照探针也能获得正确的环境光。实操心得烘焙质量取决于光照贴图的分辨率和采样参数。对于自发光物体周围你可能需要提高其光照贴图的“分辨率”通过调整物体的Lightmap Static设置中的Scale In Lightmap值否则可能会出现光晕模糊或闪烁。另外对于面积较大的自发光面如整面发光的灯箱适当调低其Emission强度避免烘焙出过曝的“光斑”。3.2 场景二动态游戏元素——实时与烘焙混合现在考虑一个地牢探险游戏。玩家手持火把动态墙壁上有固定的火把座静态还有偶尔闪烁的魔法陷阱动态。这是一个典型的混合场景需要精细配置静态光源墙壁火把座模型火把座的火焰部分使用自发光材质。材质GI模式Baked。因为它是静态的烘焙能获得最好效果和性能。效果烘焙后墙壁上会有固定的火焰光照和阴影。动态光源玩家火把模型玩家手中的火把模型火焰部分使用自发光材质。材质GI模式Realtime。这是核心。光照探针确保场景已经烘焙过包含了静态火把座的光照这样场景中已经布置好了光照探针组。实现当玩家移动时其身上的Renderer组件会实时从周围的光照探针中采样光照信息。由于玩家火把的自发光材质是Realtime模式它的光照信息会被“注入”到它所在位置的光照探针影响力中从而实时地照亮玩家自身以及附近的其他动态物体如怪物。但是它不会实时改变静态墙壁的烘焙光照贴图。动态特效闪烁陷阱材质GI模式同样设为Realtime。通过脚本控制Emission强度使用Material.SetColor(“_EmissionColor”, color * intensity)来动态改变发光强度实现闪烁。由于是Realtime模式这个强度变化也会实时影响周围动态物体的光照探针采样。混合策略的挑战玩家手持Realtime火把走近一面被Baked火把照亮的墙壁时墙壁的亮度不会因为玩家靠近而改变因为墙壁的光照是烘焙死的。为了增强真实感我们有时会用一个技巧在玩家火把上附加一个微弱的、影响范围很小的Realtime点光源仅影响动态物体专门用于在墙壁上产生实时的、轻微的高光和闪烁感与烘焙的基础光照叠加。3.3 场景三性能优化——慎用Realtime善用烘焙对于移动端或大型开放世界项目性能是生命线。Emission的配置直接影响Draw Call和GPU负担。原则能Baked就Baked。这是铁律。将场景中所有不需要动态变化的发光体全部标记为Static材质设为Baked。这能将所有复杂的光照计算转移到编辑时运行时零开销。减少Realtime Emission物体数量每个Realtime的Emission物体都会增加光照探针系统的数据量和更新复杂度。只对那些必须动态移动或变化的发光源使用此模式。使用光照贴图替代复杂自发光对于远处大面积的发光广告牌与其用一个高精度的模型加Emission材质不如直接将其发光和光照效果烘焙到一张简单的面片模型的光照贴图上。这样可以大幅减少顶点数和材质复杂度。检查Emission的Shader性能确保你的自发光材质使用的Shader是性能友好的。对于移动平台避免在Emission通道使用非常复杂的贴图或实时计算。使用简单的顶点光照或烘焙光照Shader变体。4. 高级技巧与常见问题排查掌握了基础配置一些高级技巧和“坑”能让你事半功倍。4.1 使用Emission贴图实现复杂发光图案单纯的颜色发光很单调。Emission属性支持贴图输入这打开了新世界的大门。制作贴图准备一张灰度图或RGB彩色图白色或高亮色代表发光区域黑色代表不发光。这张图就是你的发光“蒙版”。材质设置将贴图拖入材质的Emission贴图槽。你会发现Color变成了一个倍增器。你可以用HDR颜色来控制基础发光色和强度而贴图则控制发光的形状和细节变化。应用场景霓虹灯文字用一张包含文字Alpha通道的贴图轻松做出霓虹灯管效果。破损的屏幕一张显示破损裂纹的Emission贴图让屏幕只有部分区域发光。魔法符文符文图案作为Emission贴图让符文在物体表面发光。GI模式选择贴图Emission同样遵循Baked/Realtime/None的规则。如果图案是静态的比如墙上的涂鸦用Baked。如果图案会变化比如屏幕上的动态画面你需要用Realtime模式并通过脚本动态更换Emission贴图或修改其UV偏移。4.2 常见问题与解决方案实录在实际项目中你几乎一定会遇到下面这些问题问题1为什么我的自发光物体在烘焙后看起来一片死白过曝原因Emission的HDR强度Intensity设置过高超过了光照贴图能够存储的亮度范围。排查在Lighting窗口的Environment标签页下检查Baked Lightmaps的Compression是否开启。有时压缩会导致高光区域细节丢失。更主要的是检查Lightmap的Exposure设置和相机后期处理的Tonemapping。解决首先理性降低材质的Emission Intensity值。尝试从5降到2重新烘焙看效果。在Lighting Scene标签下尝试调高Baked Global Illumination的Indirect Intensity间接光强度或调整Lightmap的Exposure。确保使用了正确的Tonemapping如ACES来压缩高动态范围到屏幕显示范围。问题2动态物体靠近烘焙的自发光体时没有被照亮或照亮效果不对。原因光照探针数据不足或采样有问题。排查确认自发光材质的GI模式是Baked。确认场景已经成功烘焙了光照探针Lighting窗口底部会显示探针数量。检查动态物体如角色的MeshRenderer组件上是否启用了Light Probes通常是Blend Probes或Use Proxy Volume。在Scene视图中开启Gizmos Light Probes查看探针的分布。发光体周围是否有足够密集的探针解决手动在发光体周围放置更多的光照探针使用Light Probe Group。确保探针的覆盖范围能包裹住动态物体的活动区域。对于大型发光面可能需要更密集的探针来捕捉其光照梯度变化。问题3Realtime Emission的动态物体其光照效果更新有延迟或闪烁。原因光照探针的更新频率或插值方式导致。排查动态RealtimeEmission物体移动过快而光照探针网络相对稀疏导致物体在不同探针间切换时采样的光照值发生跳变。解决优化探针布局在动态发光体活动路径上增加探针密度。考虑使用Light Probe Proxy VolumeLPPV代替单个探针组为大型动态物体提供更精确的体积内光照插值。如果性能允许可以尝试提高GI系统的更新频率但这对性能影响较大需谨慎。问题4使用Emission后物体看起来“浮”在场景上没有阴影缺乏体积感。原因Emission是自发光它本身不接收阴影除非使用特殊Shader。一个完全依赖Emission照亮的物体如果场景中没有其他主光源为其产生阴影就会显得扁平。解决结合环境光遮蔽确保场景烘焙了环境光遮蔽Ambient Occlusion这能为物体增加接触阴影增强体积感。添加辅助光源即使主要照明来自Emission也可以添加一个非常微弱的平行光或天空盒环境光仅为物体提供微妙的阴影方向。使用复杂Shader考虑使用自定义Shader让Emission部分也能受到法线贴图、高度图的影响产生更立体的发光效果而不是简单的平面发光。4.3 性能监控与调试工具Frame Debugger在播放模式下使用Window Analysis Frame Debugger。你可以逐帧查看绘制调用检查带有Emission的材质是否被正确批处理以及是否触发了额外的Pass。Lighting Preview Modes在Scene视图的照明模式下拉菜单中切换到Baked Global Illumination、Realtime Global Illumination或Light Probes模式。这能帮你直观地分离查看烘焙光照、实时光照和探针光照的效果快速定位问题。Profiler在Profiler的Rendering部分关注SetPass Calls和Batches。大量独特的Emission材质尤其是不同的Emission贴图会阻碍动态批处理和GPU Instancing导致批次上升。尽量合并材质共享贴图。Emission属性是连接美术表现与技术实现的一座桥梁。把它用好了你就能用极低的运行时开销换来场景质感的巨大提升。核心思路永远是静态的、固定的光用Baked动态的、变化的光用Realtime无关紧要的光用None。结合HDR强度控制和Emission贴图你几乎可以模拟出任何需要的光源效果。最后别忘了在目标平台上进行充分的性能和效果测试因为光照在移动设备和PC上的表现可能差异很大根据平台能力调整Emission的强度、精度和GI策略是项目后期优化必不可少的一环。