Unity3d Terrain地形制作系列(三)雪山

游戏地形雪山效果

雪山效果

要达到雪山覆盖的效果,我们要判断两张贴图的方向向量,通过方向来渲染雪的颜色。

定义属性

    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
    }

效果展示
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值