[Unity] 怎么在Unity5中烘焙lightmap

原文链接:Game Dev Tip: How to bake Lightmap in Unity 5 !

什么是Light-map

Light-map是一张贴图(texture),存储了从场景(scene)中直接烘焙而来的灯光信息,通过这张贴图,我们可以减少draw call,提升我们游戏的性能。light-map通常没有阴影(shadow)。全局光照(Global Illumination)和环境光散射(Ambient occlusion)会被烘焙到Light-map上,在不影响帧率(FPS)的情况下给环境一种惊人的深度(give an amazing depth to the environment )。实时灯光只会被运用在移动或者需要动态阴影的棘手物体上。场景以来烘焙light-map都是游戏开发过程中一项非常标准化的工作,用空间换时间来加快渲染速度。

接下来需要什么

为了学习本教程,我们将学习一下基础知识并使用unity中最原始的物体来烘焙light-map以为示例。之后,你就可以在unity中使用相同的技术来烘焙那些非常酷炫的模型了。

  • 包含一个平面(plane)和一个盒子(box)的3D场景


    A 3D scene exported from any 3D software with a plane and a box

  • 盒子需要两个UV通道(uv channel),一个((UV 2 is not mandatory but it is always better to manual unwrap for better quality light-maps))用来做漫反射,另一个(channel2)用来做ligt-map。(UV2 不是必要的,但手动解包能得到更高质量的ligth-map)


    The box should have two UV channels. Channel 1 for Diffuse and Channel 2 for Light-mapping

做完了上面的准备之后,在Unity中建立一个正确的场景。我们会以FBX或者Obj等任意unity支持的3D格式导出3D模型。

建立场景

  • 将3D模型导入到Unity场景中。对导入的模型使用下面的导入设置以确保你能得到高质量的light-map。
    Note: 如果你的3D物体没有UV2通道,可以在import settings里打开 ’ GENERATE LIGHTMAP UVs’,这样可以自动为3D物体打开UV2通道


    这里写图片描述

  • 复制box并把它们穿插交叠在一起,这样可以看到接触阴影(contact shadow)或周环境光散射(Ambient occlusion)


    这里写图片描述

  • 标记3D物体为static,light-map只会烘焙static的物体(note: Lightmap static也可以)


    这里写图片描述
    这里写图片描述

  • 选中平行光源,标记为static,这个光源会为我们的light-map提供光照信息

  • 按下图改变平行光源的设置,将Baking选项中的Real-time改为Baked


    这里写图片描述

  • Project setting -> Quality setting,改成下图所示的设置。为什么这么做呢,因为默认的shadow setting不怎么好而且模糊。


    这里写图片描述

    接下去我们就可以接触light-map的设置了。

调整Light-map设置

设置位置在 Windows > Lighting > Scenes(注:我是用的Unity5.6.0f3中在Windows > Lighting > Settings 中)。

如果想要获取更过关于此处setting的属性信息,可以查看unity官方文档,强烈建议上手前先阅读一遍。

请参阅下面的图片并按下图所示更改设置。

这里写图片描述

一定要记住选中所有你想要烘焙的物体。一旦所有物体被选中,按下“build”按钮开始进行烘焙。

烘焙Lightmap

当构建按钮被按下时,进度条将出现在Unity 5窗口的右下角,指示烘焙过程已经开始!

这里写图片描述

一旦处理完成,烘焙lightmap的任务就完成了,一个令人惊奇的场景出现了,阴影都被烘焙进去了!

这里写图片描述

烘焙时需要注意的事项

  • light-map分辨率的尺寸在light-map settings中。确保使用合适的尺寸,不要使用太大的尺寸,因为这会影响游戏的性能。
    这里写图片描述
  • 如果你想要清除light-map,你可以在Light-map setting中点击Build->Clear Baked Data。
    这里写图片描述
  • 如果你想要手动更改light-map的分辨率,你可以在Light-maps的Tab中,点击某个Light-map,然后你会看到这个light-map对应的贴图,可以在这个贴图上手动的修改贴图的压缩方式和分辨率。

    这里写图片描述
  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity,可以通过在Shader使用Unity提供的内置属性来访问Lightmap。通过使用"_LightMap"和"_ShadowCoord"属性,我们可以将Lightmap数据传递到Shader,并将其应用于模型表面。 以下是一个简单的例子,演示了如何在Shader使用Lightmap: ``` Shader "Custom/LightmapShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float3 worldNormal : TEXCOORD1; float3 worldPos : TEXCOORD2; float4 screenPos : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4x4 unity_ObjectToWorld; float4x4 unity_WorldToObject; float4x4 unity_LightmapST; v2f vert (appdata v) { v2f o; o.screenPos = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldNormal = mul(unity_WorldToObject, float4(v.normal, 0)).xyz; o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } fixed4 frag (v2f i) : SV_Target { float3 lightmapCoord = mul(unity_LightmapST, float4(i.worldPos, 1)).xyw; fixed4 lightmapColor = tex2D(_LightMap, lightmapCoord); fixed4 texColor = tex2D(_MainTex, i.uv); fixed4 finalColor = texColor * lightmapColor; return finalColor; } ENDCG } } } ``` 在上面的Shader,我们使用了"_LightMap"和"_ShadowCoord"属性来访问Lightmap数据,并将其与主纹理(_MainTex)相乘以获得最终的表面颜色。请注意,我们还使用了"unity_LightmapST"矩阵来转换世界坐标系下的顶点位置到Lightmap纹理坐标系下。 要将此Shader应用于模型,只需将其分配给材质即可。在材质上,您可以选择使用"Lightmap"纹理类型,并将Lightmap纹理分配给"_LightMap"属性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值