baked light+bake indirect+sampling lightmap

本文详细介绍了在Unity中使用自定义Shader进行光照贴图采样的过程,包括Shader编写、光照贴图UV转换及解码等关键步骤,并对比了自定义材质与Unity默认材质的烘焙效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如图所示:
在这里插入图片描述

这个是使用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、其次是文章中并没有将自发光和环境光添加到烘焙贴图中去,这个后面的章节会讲到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值