场景中建一个plane,一个cube一个cylinder
把场景平行光的强度调低一些,再加一个点光源,设置为绿色吧,俗话说的好:爱是一道光,绿到你发荒……
把点光源的shadowtype设置为hard shadow(默认的是无阴影)

如上图,平行光和点光源都产生了阴影。

要烘焙lightmap,就要把被烘物体设置上lightmap static

平行光和点光源都把Baking设置为Baked

在lighting面板中,把Ambient GI选成Baked
烘出来感觉暗一些,稍微把General GI里的indirect Intensity调高一些到1.5(这个不为追求什么效果)
把底下的auto前面的勾选取消掉,再点击Build

然后烘出来,可以把灯光关了

物体的光照还有阴影还在

Shader代码:

Shader "Custom/TestLightMapShader" { Properties{ _MainTex("Main Tex",2d) = ""{} } SubShader { pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" sampler2D _MainTex; float4 _MainTex_ST; struct v2f { float4 pos:POSITION; float2 uv0:TEXCOORD0; float2 uv1:TEXCOORD1; }; v2f vert(appdata_full v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv0 = TRANSFORM_TEX(v.texcoord, _MainTex); o.uv1 = v.texcoord1.xy*unity_LightmapST.xy + unity_LightmapST.zw; return o; } fixed4 frag(v2f IN) :COLOR { fixed4 col = tex2D(_MainTex,IN.uv0); float3 lm = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, IN.uv1)); col.rgb *= lm*2; return col; } ENDCG } } FallBack "Diffuse"}

定义了一个_MainTex,这里并没有赋纹理,为了和光照贴图有区别
结构体里定义:uv0与uv1
uv1对应的是光照贴图的处理

o.uv1 = v.texcoord1.xy*unity_LightmapST.xy + unity_LightmapST.zw;

看这个公式和unitycg.cginc里的TRANSFORM_TEX的定义好像是一样的

// Transforms 2D UV by scale/bias property#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)

为什么不用TRANSFORM_TEX呢
这个unity_Lightmap和unity_LightmapST是内建的直接用
但是注意,unity_Lightmap与ST之间并无下划线,这个和TRANSFORM_TEX定义的不一样,所以得这样写
这里用到了v.texcoord1,查看unitycg.cginc,发现vert的参数得用appdata_full
v.texcoord对应主纹理,v.texcoord1对应的是光照贴图(就这样理解吧)

然后到frag函数中

fixed4 col = tex2D(_MainTex,IN.uv0);float3 lm = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, IN.uv1));col.rgb *= lm*2;return col;

tex2D主纹理采样 没变
之后对lightmap贴图进行采样

float3 lm = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, IN.uv1));

这个在unitycg.cginc中定义,返回值是个half3

inline half3 DecodeLightmap( fixed4 color, half4 decodeInstructions){#if defined(UNITY_NO_RGBM) return DecodeLightmapDoubleLDR( color );#else return DecodeLightmapRGBM( color, decodeInstructions );#endif}

再与主颜色的rgb叠加

col.rgb *= lm*2;

这里lm*2是因为太暗,所以增加亮度
当然,从图上能看出来,lightmap与实时渲染的效果是不一样的,这个就需要调整了,本文不涉及。