水渲染示例

水渲染

本次分享的是关于水体的渲染,是目前为止自己做的效果最满意的 ,具体流程跟网上很多都相似


运行效果

在这里插入图片描述

效果分析

1.波浪效果,能看到水面时高时低,礁石被覆盖和露出的效果。
2.其次水平面流动的效果
3.水面中间部分颜色深,周围颜色浅的深度效果

1.波浪效果

波浪效果的实现主要通过sin曲线结合时间系数,然后沿着法线修改顶点位置实现,不过我们这里还加入z深度的影响,使其越远,水面起伏效果也明显

代码如下(示例):

 v2f o;
float3 local_vert = v.vertex;
float3 offset_vert = (_WaveAmplitude * sin(_WaveAmount * local_vert.z + _Time.y)) * v.normal;
v.vertex.xyz += offset_vert;
 o.vertex = UnityObjectToClipPos(v.vertex);

2.其次水平面流动的效果

水面流动效果就是错开采样法线纹理,再混合成新的法线

loat2 panner22 = ( 1.0 * _Time.y * float2( -0.03,0 ) + uv0_WaterNormal);
float2 panner19 = ( 1.0 * _Time.y * float2( 0.04,0.04 ) + uv0_WaterNormal);
float3 normal_1 = UnpackNormal(tex2D(_WaterNormal, panner22));
float3 normal_2 = UnpackNormal(tex2D(_WaterNormal, panner19));
float3 blend_normal = normal_1 + normal_2;
blend_normal.xy *= _NormalScale;
blend_normal = normalize(blend_normal);

水面中间部分颜色深,周围颜色浅的深度效果

采样深度图,做深度对比

float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.srceen_pos)));

float diff = saturate(pow(abs(depth - i.srceen_pos.z) + _WaterDepth, _WaterFalloff));
float4 lerpResult13 = lerp(_DeepColor, _ShalowColor, diff);

采样_GrabTexture 纹理,混合边缘效果

float2 grab_uv = (i.srceen_pos.xy / i.srceen_pos.w);
float4 grab = tex2D(_GrabTexture, (float3(grab_uv, 0) + blend_normal * _Distortion).xy);
float4 lerpResult93 = lerp(lerpResult117, grab, diff);

基础光照

 float3 albedo = lerpResult93.rgb;
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;
 float3 diffuse = _LightColor0.rgb * albedo * saturate(dot(world_normal, world_light_dir));

float3 half_spec = normalize(world_view_dir + world_light_dir);
float3 specular = _LightColor0.rgb * albedo * pow(saturate(dot(world_normal, half_spec)), _Specular)  * _WaterSmoothness ;

完整代码

  Properties
    {
        _WaterNormal("WaterNormal", 2D) = "bump" {}
        _NormalScale("Normal Scale", Float) = 0
        _DeepColor("DeepColor", Color) = (0, 0, 0, 0)
        _ShalowColor("ShalowColor", Color) = (1, 1 ,1, 1)
        _WaterDepth("Water Depth", Float) = 0
        _WaterFalloff("Water Falloff", Float) = 0
        _Distortion("Distortion", Float) = 0.5
        _Foam("Foam", 2D) = "white" {}
        _FoamDepth("FoamDepth", Float) = 0
        _FoamFalloff("Foam Falloff", Float) = 0
        _WaveAmplitude("WaveAmpitude", Float) = 0.1
        _WaveAmount("WaveAmount", Float) = 8
        _Specular("Specular", Float) = 2
        _WaterSmoothness("WaterSmoothness", Float) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Transparent" "LightdMode"="ForwardBase"}
        LOD 100
        GrabPass{ }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag       

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal :NORMAL;
                float4 tangle : TANGENT;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;               
                float4 vertex : SV_POSITION;
                float4 srceen_pos :TEXCOORD1  ;
                float4 Ttow0 :TEXCOORD2;
                float4 Ttow1:TEXCOORD3 ;
                float4 Ttow2:TEXCOORD4 ; 
            };

            sampler2D _WaterNormal;
            float4 _WaterNormal_ST;
            float _NormalScale;
            float4 _DeepColor;
            float4 _ShalowColor;
            float _WaterDepth;
            float _WaterFalloff;
            float _Distortion;
            sampler2D _Foam;
            float4 _Foam_ST;
            float _FoamDepth;
            float _FoamFalloff;
            float _WaveAmplitude;
            float _WaveAmount;
            sampler2D _CameraDepthTexture;
            float _Specular;
            float _WaterSmoothness;
            sampler2D _GrabTexture;
            v2f vert (appdata v)
            {
                v2f o;
                float3 local_vert = v.vertex;
                float3 offset_vert = (_WaveAmplitude * sin(_WaveAmount * local_vert.z + _Time.y)) * v.normal;
                v.vertex.xyz += offset_vert;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.srceen_pos = ComputeScreenPos(o.vertex);
                COMPUTE_EYEDEPTH(o.srceen_pos.z);
                
                float3 world_pos = mul(unity_ObjectToWorld, v.vertex);
                float3 world_normal = UnityObjectToWorldNormal(v.normal);
                float3 world_tangel = UnityObjectToWorldDir(v.tangle);
                float3 world_borind = cross(world_normal, world_tangel) * v.tangle.w;

                o.Ttow0 = float4(world_tangel.x, world_borind.x, world_normal.x, world_pos.x);
                o.Ttow1 = float4(world_tangel.y, world_borind.y, world_normal.y, world_pos.y);
                o.Ttow2 = float4(world_tangel.z, world_borind.z, world_normal.z, world_pos.z);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {              
                float2 uv0_WaterNormal = i.uv * _WaterNormal_ST.xy + _WaterNormal_ST.zw;
                float2 panner22 = ( 1.0 * _Time.y * float2( -0.03,0 ) + uv0_WaterNormal);
                float2 panner19 = ( 1.0 * _Time.y * float2( 0.04,0.04 ) + uv0_WaterNormal);
                float3 normal_1 = UnpackNormal(tex2D(_WaterNormal, panner22));
                float3 normal_2 = UnpackNormal(tex2D(_WaterNormal, panner19));
                float3 blend_normal = normal_1 + normal_2;
                blend_normal.xy *= _NormalScale;
                blend_normal = normalize(blend_normal);

                float3 world_pos = float3(i.Ttow0.w, i.Ttow1.w, i.Ttow2.w);
                float3 world_view_dir = normalize(UnityWorldSpaceViewDir(world_pos));
                float3 world_light_dir = normalize(UnityWorldSpaceLightDir(world_pos));
                float3 world_normal = float3(dot(i.Ttow0.xyz, blend_normal), dot(i.Ttow1.xyz, blend_normal), 
                    dot(i.Ttow2.xyz, blend_normal));

                float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.srceen_pos)));

                float diff = saturate(pow(abs(depth - i.srceen_pos.z) + _WaterDepth, _WaterFalloff));
                float4 lerpResult13 = lerp(_DeepColor, _ShalowColor, diff);

                
                float2 uv_foam = _Foam_ST.xy * ((_Time.x * float2(0.1, 0.1)) + i.uv);
                float3 foam = tex2D(_Foam, uv_foam);
                float foam_diff = saturate(pow((abs(depth - i.srceen_pos.z) + _FoamDepth), _FoamFalloff) * foam.r);
                float4 lerpResult117 = lerp( lerpResult13 , float4(1,1,1,0) , foam_diff);

                float2 grab_uv = (i.srceen_pos.xy / i.srceen_pos.w);
                float4 grab = tex2D(_GrabTexture, (float3(grab_uv, 0) + blend_normal * _Distortion).xy);
                float4 lerpResult93 = lerp(lerpResult117, grab, diff);

                float3 albedo = lerpResult93.rgb;
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;
                float3 diffuse = _LightColor0.rgb * albedo * saturate(dot(world_normal, world_light_dir));

                float3 half_spec = normalize(world_view_dir + world_light_dir);
                float3 specular = _LightColor0.rgb * albedo * pow(saturate(dot(world_normal, half_spec)), _Specular)  * _WaterSmoothness ;
                return fixed4(ambient + diffuse + specular, 1);
                //return fixed4(grab, 1);
            }
            ENDCG
        }
    }

总结

以上就是本次分享内容,后续会持续更新其他效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值