shader之——湖水(河流倒影)

本文介绍了一种用于游戏开发中的水体Shader实现方法,包括波动效果、反射纹理渲染等关键技术点。同时,提供了使用C#脚本来实现反射相机的具体步骤。

先上图

 

1.水shader

 

Shader "Game_XXX/whater" {
    Properties {
        _WaterTex ("Normal Map (RGB), Foam (A)", 2D) = "white" {}
        _WaterTex2 ("Normal Map (RGB), Foam (B)", 2D) = "white" {}

        _Tiling ("Wave Scale", Range(0.00025, 0.1)) = 0.25
        _WaveSpeed("Wave Speed", Float) = 0.4

        
        _SpecularRatio ("Specular Ratio", Range(10,500)) = 200

        _BottomColor("Bottom Color",Color) = (0,0,0,0)
        _TopColor("Top Color",Color) = (0,0,0,0)
        _Alpha("Alpha",Range(0,1)) = 1

        _ReflectionTex("_ReflectionTex", 2D) = "black" {}
        _ReflectionLight("ReflectionLight",Range(0,1)) = 0.3

        _LightColorSelf ("LightColorSelf",Color) = (1,1,1,1)
        _LightDir ("LightDir",vector) = (0,1,0,0)

        
        
    }
    
    SubShader {  
        Tags {
            "Queue"="Transparent-200"
            "RenderType"="Transparent" 
            "IgnoreProjector" = "True"
            "LightMode" = "ForwardBase"
        }
        LOD 250
        Pass{
            Lighting On
            ZWrite On
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM

            #pragma vertex Vert
            #pragma fragment Frag
            #include "UnityCG.cginc"
            
             float _Tiling;
             float _WaveSpeed;
             float _SpecularRatio;
             sampler2D _WaterTex;
             sampler2D _WaterTex2;
             sampler2D _ReflectionTex;
             float4 _LightColorSelf;
             float4 _LightDir;
             float4 _BottomColor;
             float4 _TopColor;
             float _Alpha;
             float _ReflectionLight;


            struct v2f
            {
             float4 position  : POSITION;
             float3 worldPos  : TEXCOORD0;
             float3 tilingAndOffset:TEXCOORD2;
             float4 screen:TEXCOORD3;
             float4 VertColor :TEXCOORD4;

            };

    





            v2f Vert(appdata_full v)
            {
             v2f o;
             o.worldPos = mul(unity_ObjectToWorld, v.vertex);
             o.position = UnityObjectToClipPos(v.vertex);
             //uv动画
             o.tilingAndOffset.z =frac( _Time.x * _WaveSpeed);
             o.tilingAndOffset.xy = o.worldPos.xz*_Tiling;
             o.screen = ComputeScreenPos(o.position);
             o.VertColor = v.color;
             return o;
            }



            float4 Frag(v2f i):COLOR
            {
              float3 lightColor=_LightColorSelf.rgb*2;
              //世界视向量
              float3 worldView = -normalize(i.worldPos - _WorldSpaceCameraPos);
              float2 tiling = i.tilingAndOffset.xy;
              //法线采样
              float4 N1 = tex2D(_WaterTex, tiling.yx +float2(i.tilingAndOffset.z,0));
              float4 N2 = tex2D(_WaterTex2, tiling.yx -float2(i.tilingAndOffset.z,0));
              //两个法线相加,转世界空间,这里没有unpack,所以法线贴图不需要转normal  法线贴图为0-1 两张加起来为0-2 将其x2-2,转换为-2 --2然后将其normalize,变成-1到1
              //在遇到两张法线的情况下 ,一般将法线相加 再normalize
              float3 worldNormal  = normalize((N1.xyz+N2.xyz)*2-2);
              //以垂直的方向代替灯光 跟法线做点积 得到漫反射强度
              float LdotN = dot(worldNormal, float3(0,1,0));
              fixed2 uv = i.screen.xy/(i.screen.w
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值