Water Pro 4 problemes

Hi,

I am using the Water 4 shader given by Unity and try to apply it on my water mesh.

The thing is, I am making a wave, and the shader is acting weirdly, calculating (i think) wrong normals

Picture is better than words :
top view (correct results)
2143773--141383--1.png
Side view : I can see through the water.

So basically I would like to disable transparency on the wave, or correct calculated normals on the wave (or maybe something else ?)
I tried many settings within the editor, but nothing works, so I need to edit the shader itself… but I don’t know how.

Do you have any idea how should I start ?

In another hand, if you know a nice shader that can have a good render on a wave, I am open to any suggestion.

Thank you.

Here is the shader code, so you don’t have to get in into Unity :

Shader "FX/Water4" {
Properties {
    _ReflectionTex ("Internal reflection", 2D) = "white" {}
 
    _MainTex ("Fallback texture", 2D) = "black" {} 
    _ShoreTex ("Shore & Foam texture ", 2D) = "black" {} 
    _BumpMap ("Normals ", 2D) = "bump" {}
             
    _DistortParams ("Distortions (Bump waves, Reflection, Fresnel power, Fresnel bias)", Vector) = (1.0 ,1.0, 2.0, 1.15)
    _InvFadeParemeter ("Auto blend parameter (Edge, Shore, Distance scale)", Vector) = (0.15 ,0.15, 0.5, 1.0)
 
    _AnimationTiling ("Animation Tiling (Displacement)", Vector) = (2.2 ,2.2, -1.1, -1.1)
    _AnimationDirection ("Animation Direction (displacement)", Vector) = (1.0 ,1.0, 1.0, 1.0)

    _BumpTiling ("Bump Tiling", Vector) = (1.0 ,1.0, -2.0, 3.0)
    _BumpDirection ("Bump Direction & Speed", Vector) = (1.0 ,1.0, -1.0, 1.0)
 
    _FresnelScale ("FresnelScale", Range (0.15, 4.0)) = 0.75 

    _BaseColor ("Base color", COLOR)  = ( .54, .95, .99, 0.5) 
    _ReflectionColor ("Reflection color", COLOR)  = ( .54, .95, .99, 0.5) 
    _SpecularColor ("Specular color", COLOR)  = ( .72, .72, .72, 1)
 
    _WorldLightDir ("Specular light direction", Vector) = (0.0, 0.1, -0.5, 0.0)
    _Shininess ("Shininess", Range (2.0, 500.0)) = 200.0 
 
    _Foam ("Foam (intensity, cutoff)", Vector) = (0.1, 0.375, 0.0, 0.0)
 
    _GerstnerIntensity("Per vertex displacement", Float) = 1.0
    _GAmplitude ("Wave Amplitude", Vector) = (0.3 ,0.35, 0.25, 0.25)
    _GFrequency ("Wave Frequency", Vector) = (1.3, 1.35, 1.25, 1.25)
    _GSteepness ("Wave Steepness", Vector) = (1.0, 1.0, 1.0, 1.0)
    _GSpeed ("Wave Speed", Vector) = (1.2, 1.375, 1.1, 1.5)
    _GDirectionAB ("Wave Direction", Vector) = (0.3 ,0.85, 0.85, 0.25)
    _GDirectionCD ("Wave Direction", Vector) = (0.1 ,0.9, 0.5, 0.5) 
}


CGINCLUDE
 
    #include "UnityCG.cginc"
    #include "WaterInclude.cginc"

    struct appdata
    {
        float4 vertex : POSITION;
        float3 normal : NORMAL;
    };

    // interpolator structs
 
    struct v2f
    {
        float4 pos : SV_POSITION;
        float4 normalInterpolator : TEXCOORD0;
        float4 viewInterpolator : TEXCOORD1;  
        float4 bumpCoords : TEXCOORD2;
        float4 screenPos : TEXCOORD3; 
        float4 grabPassPos : TEXCOORD4;
    };

    struct v2f_noGrab
    {
        float4 pos : SV_POSITION;
        float4 normalInterpolator : TEXCOORD0;
        float3 viewInterpolator : TEXCOORD1;  
        float4 bumpCoords : TEXCOORD2;
        float4 screenPos : TEXCOORD3; 
    };
     
    struct v2f_simple
    {
        float4 pos : SV_POSITION;
        float4 viewInterpolator : TEXCOORD0;  
        float4 bumpCoords : TEXCOORD1;
    }; 

    // textures
    sampler2D _BumpMap;
    sampler2D _ReflectionTex;
    sampler2D _RefractionTex;
    sampler2D _ShoreTex;
    sampler2D_float _CameraDepthTexture;

    // colors in use
    uniform float4 _RefrColorDepth;
    uniform float4 _SpecularColor;
    uniform float4 _BaseColor;
    uniform float4 _ReflectionColor;
 
    // edge & shore fading
    uniform float4 _InvFadeParemeter;

    // specularity
    uniform float _Shininess;
    uniform float4 _WorldLightDir;

    // fresnel, vertex & bump displacements & strength
    uniform float4 _DistortParams;
    uniform float _FresnelScale; 
    uniform float4 _BumpTiling;
    uniform float4 _BumpDirection;

    uniform float4 _GAmplitude;
    uniform float4 _GFrequency;
    uniform float4 _GSteepness;                                  
    uniform float4 _GSpeed;                 
    uniform float4 _GDirectionAB;     
    uniform float4 _GDirectionCD;
 
    // foam
    uniform float4 _Foam;
 
    // shortcuts
    #define PER_PIXEL_DISPLACE _DistortParams.x
    #define REALTIME_DISTORTION _DistortParams.y
    #define FRESNEL_POWER _DistortParams.z
    #define VERTEX_WORLD_NORMAL i.normalInterpolator.xyz
    #define FRESNEL_BIAS _DistortParams.w
    #define NORMAL_DISPLACEMENT_PER_VERTEX _InvFadeParemeter.z
 
    //
    // HQ VERSION
    //
     
    v2f vert(appdata_full v)
    {
        v2f o;
     
        half3 worldSpaceVertex = mul(_Object2World,(v.vertex)).xyz;
        half3 vtxForAni = (worldSpaceVertex).xzz * unity_Scale.w;      

        half3 nrml;
        half3 offsets;
        Gerstner (
            offsets, nrml, v.vertex.xyz, vtxForAni,                     // offsets, nrml will be written
            _GAmplitude,                                                 // amplitude
            _GFrequency,                                                 // frequency
            _GSteepness,                                                 // steepness
            _GSpeed,                                                    // speed
            _GDirectionAB,                                                // direction # 1, 2
            _GDirectionCD                                                // direction # 3, 4
        );
             
        v.vertex.xyz += offsets;     
                         
        // one can also use worldSpaceVertex.xz here (speed!), albeit it'll end up a little skewed 
        half2 tileableUv = mul(_Object2World,(v.vertex)).xz;
             
        o.bumpCoords.xyzw = (tileableUv.xyxy + _Time.xxxx * _BumpDirection.xyzw) * _BumpTiling.xyzw; 

        o.viewInterpolator.xyz = worldSpaceVertex - _WorldSpaceCameraPos;

        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

        ComputeScreenAndGrabPassPos(o.pos, o.screenPos, o.grabPassPos);
     
        o.normalInterpolator.xyz = nrml;
     
        o.viewInterpolator.w = saturate(offsets.y);
        o.normalInterpolator.w = 1;//GetDistanceFadeout(o.screenPos.w, DISTANCE_SCALE);
     
        return o;
    }

    half4 frag( v2f i ) : SV_Target
    {             
        half3 worldNormal = PerPixelNormal(_BumpMap, i.bumpCoords, VERTEX_WORLD_NORMAL, PER_PIXEL_DISPLACE);
        half3 viewVector = normalize(i.viewInterpolator.xyz);

        half4 distortOffset = half4(worldNormal.xz * REALTIME_DISTORTION * 10.0, 0, 0);
        half4 screenWithOffset = i.screenPos + distortOffset;
        half4 grabWithOffset = i.grabPassPos + distortOffset;
     
        half4 rtRefractionsNoDistort = tex2Dproj(_RefractionTex, UNITY_PROJ_COORD(i.grabPassPos));
        half refrFix = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(grabWithOffset));
        half4 rtRefractions = tex2Dproj(_RefractionTex, UNITY_PROJ_COORD(grabWithOffset));
     
        #ifdef WATER_REFLECTIVE
            half4 rtReflections = tex2Dproj(_ReflectionTex, UNITY_PROJ_COORD(screenWithOffset)); 
        #endif

        #ifdef WATER_EDGEBLEND_ON
        if (LinearEyeDepth(refrFix) < i.screenPos.z)
            rtRefractions = rtRefractionsNoDistort; 
        #endif
     
        half3 reflectVector = normalize(reflect(viewVector, worldNormal));       
        half3 h = normalize ((_WorldLightDir.xyz) + viewVector.xyz);
        float nh = max (0, dot (worldNormal, -h));
        float spec = max(0.0,pow (nh, _Shininess));     
     
        half4 edgeBlendFactors = half4(1.0, 0.0, 0.0, 0.0);
     
        #ifdef WATER_EDGEBLEND_ON
            half depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos));
            depth = LinearEyeDepth(depth);
            edgeBlendFactors = saturate(_InvFadeParemeter * (depth-i.screenPos.w));     
            edgeBlendFactors.y = 1.0-edgeBlendFactors.y;
        #endif 
     
        // shading for fresnel term
        worldNormal.xz *= _FresnelScale;
        half refl2Refr = Fresnel(viewVector, worldNormal, FRESNEL_BIAS, FRESNEL_POWER);
             
        // base, depth & reflection colors
        half4 baseColor = ExtinctColor (_BaseColor, i.viewInterpolator.w * _InvFadeParemeter.w);
        #ifdef WATER_REFLECTIVE
            half4 reflectionColor = lerp (rtReflections,_ReflectionColor,_ReflectionColor.a);
        #else
            half4 reflectionColor = _ReflectionColor;
        #endif
     
        baseColor = lerp (lerp (rtRefractions, baseColor, baseColor.a), reflectionColor, refl2Refr);
        baseColor = baseColor + spec * _SpecularColor;
     
        // handle foam
        half4 foam = Foam(_ShoreTex, i.bumpCoords * 2.0);
        baseColor.rgb += foam.rgb * _Foam.x * (edgeBlendFactors.y + saturate(i.viewInterpolator.w - _Foam.y));
     
        baseColor.a = edgeBlendFactors.x;
        return baseColor;
    }
 
    //
    // MQ VERSION
    //
 
    v2f_noGrab vert300(appdata_full v)
    {
        v2f_noGrab o;
     
        half3 worldSpaceVertex = mul(_Object2World,(v.vertex)).xyz;
        half3 vtxForAni = (worldSpaceVertex).xzz * unity_Scale.w;          

        half3 nrml;
        half3 offsets;
        Gerstner (
            offsets, nrml, v.vertex.xyz, vtxForAni,                     // offsets, nrml will be written
            _GAmplitude,                                                 // amplitude
            _GFrequency,                                                 // frequency
            _GSteepness,                                                 // steepness
            _GSpeed,                                                    // speed
            _GDirectionAB,                                                // direction # 1, 2
            _GDirectionCD                                                // direction # 3, 4
        );
             
        v.vertex.xyz += offsets;     
                         
        // one can also use worldSpaceVertex.xz here (speed!), albeit it'll end up a little skewed 
        half2 tileableUv = mul(_Object2World,v.vertex).xz;                 
        o.bumpCoords.xyzw = (tileableUv.xyxy + _Time.xxxx * _BumpDirection.xyzw) * _BumpTiling.xyzw; 

        o.viewInterpolator.xyz = worldSpaceVertex - _WorldSpaceCameraPos;

        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

        o.screenPos = ComputeScreenPos(o.pos);
     
        o.normalInterpolator.xyz = nrml;
        o.normalInterpolator.w = 1;//GetDistanceFadeout(o.screenPos.w, DISTANCE_SCALE);
     
        return o;
    }

    half4 frag300( v2f_noGrab i ) : SV_Target
    {     
        half3 worldNormal = PerPixelNormal(_BumpMap, i.bumpCoords, normalize(VERTEX_WORLD_NORMAL), PER_PIXEL_DISPLACE);

        half3 viewVector = normalize(i.viewInterpolator.xyz);

        half4 distortOffset = half4(worldNormal.xz * REALTIME_DISTORTION * 10.0, 0, 0);
        half4 screenWithOffset = i.screenPos + distortOffset;
     
        #ifdef WATER_REFLECTIVE     
            half4 rtReflections = tex2Dproj(_ReflectionTex, UNITY_PROJ_COORD(screenWithOffset)); 
        #endif
     
        half3 reflectVector = normalize(reflect(viewVector, worldNormal));       
        half3 h = normalize (_WorldLightDir.xyz + viewVector.xyz);
        float nh = max (0, dot (worldNormal, -h));
        float spec = max(0.0,pow (nh, _Shininess)); 
     
        half4 edgeBlendFactors = half4(1.0, 0.0, 0.0, 0.0);
     
        #ifdef WATER_EDGEBLEND_ON
            half depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos));
            depth = LinearEyeDepth(depth);
            edgeBlendFactors = saturate(_InvFadeParemeter * (depth-i.screenPos.z));     
            edgeBlendFactors.y = 1.0-edgeBlendFactors.y;
        #endif     
     
        worldNormal.xz *= _FresnelScale;     
        half refl2Refr = Fresnel(viewVector, worldNormal, FRESNEL_BIAS, FRESNEL_POWER);
     
        half4 baseColor = _BaseColor;
        #ifdef WATER_REFLECTIVE 
            baseColor = lerp (baseColor, lerp (rtReflections,_ReflectionColor,_ReflectionColor.a), saturate(refl2Refr * 2.0));
        #else
            baseColor = lerp (baseColor, _ReflectionColor, saturate(refl2Refr * 2.0));     
        #endif
     
        baseColor = baseColor + spec * _SpecularColor;
     
        baseColor.a = edgeBlendFactors.x * saturate(0.5 + refl2Refr * 1.0);
        return baseColor;
    } 
 
    //
    // LQ VERSION
    //
 
    v2f_simple vert200(appdata_full v)
    {
        v2f_simple o;
     
        half3 worldSpaceVertex = mul(_Object2World, v.vertex).xyz;
        half2 tileableUv = worldSpaceVertex.xz;

        o.bumpCoords.xyzw = (tileableUv.xyxy + _Time.xxxx * _BumpDirection.xyzw) * _BumpTiling.xyzw; 

        o.viewInterpolator.xyz = worldSpaceVertex-_WorldSpaceCameraPos;
     
        o.pos = mul(UNITY_MATRIX_MVP,  v.vertex);
     
        o.viewInterpolator.w = 1;//GetDistanceFadeout(ComputeScreenPos(o.pos).w, DISTANCE_SCALE);
     
        return o;

    }

    half4 frag200( v2f_simple i ) : SV_Target
    {     
        half3 worldNormal = PerPixelNormal(_BumpMap, i.bumpCoords, half3(0,1,0), PER_PIXEL_DISPLACE);
        half3 viewVector = normalize(i.viewInterpolator.xyz);

        half3 reflectVector = normalize(reflect(viewVector, worldNormal));       
        half3 h = normalize ((_WorldLightDir.xyz) + viewVector.xyz);
        float nh = max (0, dot (worldNormal, -h));
        float spec = max(0.0,pow (nh, _Shininess)); 

        worldNormal.xz *= _FresnelScale;     
        half refl2Refr = Fresnel(viewVector, worldNormal, FRESNEL_BIAS, FRESNEL_POWER); 

        half4 baseColor = _BaseColor;
        baseColor = lerp(baseColor, _ReflectionColor, saturate(refl2Refr * 2.0));
        baseColor.a = saturate(2.0 * refl2Refr + 0.5);

        baseColor.rgb += spec * _SpecularColor.rgb;
        return baseColor; 
    }
         
ENDCG

Subshader
{
    Tags {"RenderType"="Transparent" "Queue"="Transparent"}
 
    Lod 500
    ColorMask RGB
 
    GrabPass { "_RefractionTex" }
 
    Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            ZTest LEqual
            ZWrite Off
            Cull Off
         
            CGPROGRAM
         
            #pragma target 3.0
         
            #pragma vertex vert
            #pragma fragment frag
         
            #pragma glsl
         
            #pragma fragmentoption ARB_precision_hint_fastest
                     
            #pragma multi_compile WATER_VERTEX_DISPLACEMENT_ON WATER_VERTEX_DISPLACEMENT_OFF
            #pragma multi_compile WATER_EDGEBLEND_ON WATER_EDGEBLEND_OFF     
            #pragma multi_compile WATER_REFLECTIVE WATER_SIMPLE             
                                   
            ENDCG
    }
}

Subshader
{  
    Tags {"RenderType"="Transparent" "Queue"="Transparent"}
 
    Lod 300
    ColorMask RGB
 
    Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            ZTest LEqual
            ZWrite Off
            Cull Off
         
            CGPROGRAM
         
            #pragma target 3.0
         
            #pragma vertex vert300
            #pragma fragment frag300
         
            #pragma glsl
         
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile WATER_VERTEX_DISPLACEMENT_ON WATER_VERTEX_DISPLACEMENT_OFF
            #pragma multi_compile WATER_EDGEBLEND_ON WATER_EDGEBLEND_OFF                     
            #pragma multi_compile WATER_REFLECTIVE WATER_SIMPLE             
                                   
            ENDCG
    } 
}

Subshader
{  
    Tags {"RenderType"="Transparent" "Queue"="Transparent"}
 
    Lod 200
    ColorMask RGB
 
    Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            ZTest LEqual
            ZWrite Off
            Cull Off
         
            CGPROGRAM
         
            #pragma vertex vert200
            #pragma fragment frag200
            #pragma fragmentoption ARB_precision_hint_fastest                     
                                   
            ENDCG
    } 
}

Fallback "Transparent/Diffuse"
}

2143773--141383--1.png

Yeah ! I found it !

Just need to activate the ZWrite in Pass !