unity内如何在shader中写入lightmap
时间: 2024-02-09 10:11:44 浏览: 27
在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"属性。