baked light+bake indirect+sampling lightmap
如图所示:
这个是使用unity默认的材质:
进行烘焙的结果。
下面我们要通过自己写shader,来完成光照贴图的采样。
Shader "MyShader/SampleLightmap"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ LIGHTMAP_ON
#include"Lighting.cginc"
struct VertexData
{
float4 pos:POSITION;
float2 uv:TEXCOORD0;
float2 uv1:TEXCOORD1;
};
struct V2F
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
#if defined(LIGHTMAP_ON)
float2 uv1:TEXCOORD1;
#endif
};
V2F vert(VertexData v)
{
V2F res;
res.pos = UnityObjectToClipPos(v.pos);
res.uv = v.uv;
#if defined(LIGHTMAP_ON)
res.uv1 = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;
#endif
return res;
}
fixed4 frag(V2F i):SV_TARGET
{
fixed4 col = fixed4(1,0,0,1);
#if defined(LIGHTMAP_ON)
col.rgb = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv1));
#endif
return col;
}
ENDCG
}
}
}
ok,这里几个注意点:
1、包含头文件:#include"Lighting.cginc", 因为DecodeLightmap函数在其中声明的
2、编译变体:#pragma multi_compile _ LIGHTMAP_ON
3、光照贴图uv的转换:res.uv1 = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;
4、解码光照贴图数据:DecodeLightmap
把场景中物体使用的材质换成我们的材质球:
左图为我们自己的材质球,右图是unity默认的材质球,效果还是近似的,说明采样正确。
本文着重阐述了,如何在全是baked模式下灯光烘焙,然后使用烘焙indirect的方式进行烘焙,最后完成采样的过程。
注意点:
我们的主灯就一个平行光,其模式为baked,也就是静态的。
如果我们采用的是shadowmask进行烘焙,其实效果不变,也就是说shadowmask对baked的灯光是没有作用的,同样他对realtime的灯也是没有作用的,只对mixed模式的灯才有作用。
另外有人可能不太明白什么是有这个关键字:LIGHTMAP_ON
其实是当烘焙之后有烘焙贴图了,那么此时这个关键字就被激活了。如果你clear掉:
那么此时关键字就关闭了。
记得哦,如果你把光照贴图删除了,此时是变成黑色,而不是说关键字就关闭了,此时关键字还是打开的,只是光照数据为0而已。
关于此文章的说明:
1、首先上面的物件都是使用的我们自己的材质,在没有烘焙之前全部是fixed4 col = fixed4(1,0,0,1);红色。一旦烘焙之后,采用的是光照贴图。
2、其次是文章中并没有将自发光和环境光添加到烘焙贴图中去,这个后面的章节会讲到。