游戏地形雪山效果
雪山效果
要达到雪山覆盖的效果,我们要判断两张贴图的方向向量,通过方向来渲染雪的颜色。
定义属性
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Bump("Bump",2D)="bump"{}
_Snow("Snow", Range(0,1)) = 0.5
_SnowDirection("SnowDirection", Vector) =(0,1,0)//Vector也是四元数组
}
子着色器
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float2 uv_Bump;
float3 worldNormal;INTERNAL_DATA//世界空间中的法线向量(normal vector)。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数。为了获得获得基于每个顶点法线贴图(per-pixel normal map)的法线向量(normal vector)需要使用世界法线向量(WorldNormalVector(IN,o.Normal))
};
//申明属性里定义的
sampler2D _Bump;
float4 _Color;
float _Snow;
float4 _SnowDirection;
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c=tex2D(_MainTex,IN.uv_MainTex);
o.Normal=UnpackNormal(tex2D(_Bump,IN.uv_Bump));//UnpackNormal接受一个fixed4的输入,并将其转换为所对应的法线值(fixed3),并将其赋值给输出的Normal,就可以参与到光线运算中完成接下来的的渲染工作。
//dot函数的作用用于返回两个向量的标量积
//WorldNormalVector表示转化为世界坐标的法向量
//lerp代表线性插值,当_Snow取最小值1时,这个函数将返回1,而Snow取最大值时,返回-1
if((dot(WorldNormalVector(IN,o.Normal),_SnowDirection.xyz))>lerp(1,-1,_Snow)){
o.Albedo=_Color.rgb;
}
else{
o.Albedo=c.rgb;
}
o.Alpha = c.a;
}
ENDCG
}
效果展示