Unity全局光照以及shader的使用方法

本文介绍如何在Unity中使用自定义Shader支持光照贴图功能。通过调整物体属性及光照设置,结合UnityCG.cginc中的函数,实现了模型在无光照环境下的阴影效果。文中提供了具体Shader代码实例。

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

unity自带的shader都是支持光照贴图的,光照贴图可以让Unity中的模型在没有光照的情况下,在物体上产生阴影效果。5.0以后光照贴图的形式都有一定的改变。而在自己写的shader中需要对光照贴图进行相应的设置。


光照贴图准备工作:

1.light中Baking的模式选为Baked,为了查看效果,此处Shadow Type的模式选为Soft Shadows。

2.选中需要进行烘焙的物体,将其static选项设置为Lightmap Static,windows=》lighting=》Setting 中取消Auto Generate,同时取消任何看到的realtime的选项,然后generate lighting即可。

需要调用的UnityCG.cginc中的函数

//解码光照贴图,返回一个三维的颜色信息。

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

}


Shader "Licher/Texture_02" {
Properties 
{
_MainTex("MainTex",2D)=""{}
}
SubShader 
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"


sampler2D _MainTex;
sampler2D unity_Lightmap;//对应光照贴图的2d纹理
float4 _MainTex_ST;
float4 unity_LightmapST;//对应光照贴图的Scale 和Translation信息


struct v2f
{
float4 pos:POSITION;
float2 uv:TEXCOORD0;
float2 uv2:TEXCOORD1;
};


v2f vert(appdata_full v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);//将处于本地坐标的定点转化为视图坐标
o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//封装为宏的纹理对应计算
o.uv2=v.texcoord1.xy*unity_LightmapST.xy+unity_LightmapST.zw;//最原始的纹理对应计算
return o;
}


fixed4 frag(v2f IN):COLOR
{
float3 lm=DecodeLightmap(tex2D(unity_Lightmap,IN.uv2));//对光照贴图进行解码,得出对应的颜色
fixed4 color=tex2D(_MainTex,IN.uv);
color.rgb*=lm*2;//将主贴图的颜色与光照贴图进行融合,乘以2是为了加大亮度,可以不加
return color;
}
ENDCG
}
}
FallBack "Diffuse"
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值