Shader笔记(LightMap)

LightMap:模拟灯光的一张贴图,将灯光对物体产生的影响,明暗信息保存在一张贴图上。通常用在静态物体上。

优点:省去复杂的光照计算,可以对贴图进行二次处理。

缺点:多了一层纹理,需要额外的uv,静态贴图无法改变光的方向。

如果一个物体要烘焙一定要在面板中勾选static

可以多个Object用一张光照贴图,但地形一定只有一张。



烘焙3要素  地形  灯光 目标物体

烘焙三种模式


这章听的晕了吧唧的,Unity2017把lightmaping改了挺多的。回头再看这个吧。

在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"属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值