关于Unity 5.x Lightmap Shader 编译过慢的分析

针对Unity5.x中LightmapShader编译过慢的问题,本文详细分析了ShaderScripping功能的作用,并提供了一种有效的解决方案,即通过手动指定复杂场景进行智能检测以剔除不必要的Shader,从而显著提高编译速度。

关于Unity 5.x Lightmap Shader 编译过慢的分析

  • 缘起
    最近在研究Unity 5.x 的 Lightmapping 与 场景打包的相关的知识。发现坑深啊。关于怎么打包怎么用网上的教程太多了,就不再鳌述,在最后Lightmap和Scene可以通过bundle正常使用,却画不出颜色。翻阅很多的资料知道,这个问题和5.x之后的新功能 Shader Scripping有关。

  • Shader Scripping
    这里写图片描述
    这里选项的功能翻查了手册得知是和最终编译剥离冗余Shader和变量相关的设置项。如果选择Automatic, 在编译时,引擎会根据当前场景的Shader引用情况来觉得带哪些Shader功能进游戏,不需要的Shader会在这个环节被自动剥离掉。
    因为很多游戏一开始都是个空的Loading界面或者Logo界面,游戏里毫无Lighting, 所以Automatic就认为你完全不需要光照烘焙,智能的把相关Shader都剥离了。(汗)
    解决方案就是换智能为手动,这样理论上说妥妥的,因为和Lightmap 相关的代码肯定完整编进去了。然而问题出现了,当选择手动后,编译bundle神慢,慢到神么程度,就是整个进程半个小时都不会动一下。
    打开Log日志发现卡死的地方正是在Shader Compiling这一道上,由于没有剥离冗余功能,编译器要带着完整的Shader功能向各个平台版本做转化,不慢就出鬼了。
    好在Unity自己也想到大部分走到这一步的人会开始骂娘,于是聪明地在一窜勾选项后面加了个智能检测按钮。
    这里写图片描述
    那么现在我们只需要打开一个有最复杂GI Baked场景,然后按一下这个按钮检测一遍,Unity就把你不需要的东西勾掉了。
    这里写图片描述
    再次提交编译,编译过程再次回归丝滑。Y >_< Y

### 实现 LIGHTMAP_ON 开关控制 在 Unity Shader 中,可以通过条件编译指令来实现 `LIGHTMAP_ON` 的开关控制。具体方法是在 HLSL 代码中使用预处理器指令判断宏定义是否存在。 当需要支持光照贴图时,在材质属性面板提供一个选项用于切换光照贴图功能的启用状态。这个设置会传递给着色器并影响最终渲染效果[^1]。 ```c Properties { _MainTex ("Texture", 2D) = "white" {} _UseLightmap ("Use Lightmap", Float) = 0 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag sampler2D _MainTex; float _UseLightmap; struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; #if defined(LIGHTMAP_ON) float2 lightmapUV : TEXCOORD1; // 如果启用了光照贴图,则声明额外纹理坐标 #endif }; v2f o; void vert (appdata_t v, out v2f o) { o.pos = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); #if defined(LIGHTMAP_ON) o.lightmapUV = v.lightmapUV.xy * unity_LightmapST.xy + unity_LightmapST.zw; #endif } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); #if defined(LIGHTMAP_ON) if (_UseLightmap > 0.5){ fixed3 lm = DecodeLightmap(UNITY_SAMPLE_LIGHTMAP(i.lightmapUV)); col.rgb *= lm; } #endif return col; } ENDCG } } ``` 在这个例子中,通过 `_UseLightmap` 属性决定是否应用光照贴图数据到片段颜色上。如果该值大于0.5则认为开启了光照贴图模式;反之则不处理光照贴图部分[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值