Problem in Android

Hi all.
I’m new to shaders, so I only know basics. Probably this problem has been solved in the forums, but after trying many of the solutions that I found, I still cant solve this problem.

I found a water shader code, fixed some of the lines to fit into what I needed and made it work fine at Unity in OpenGL ES 3.0 mode, with the Post Processing’s Depth of Field enabled.

To make the game more stable on smartphones I turned off Post Processing, but the shader stopped working.


After search in documentation and forums, I figured out that the problem might be that depth works different in OpenGL. I tried many of the solutions that I found but none of them works, or I’m doing something wrong which is more probably.

If I try to force an inverse depth value, the foam totally disappears.

Here is the shader code:

Shader "SimpleWater"
{
    Properties
    {
        _Tint("Tint", Color) = (1, 1, 1, .5)
        _MainTex("Main Texture", 2D) = "white" {}
        _Speed("Wave Speed", Range(0,1)) = 0.5
        _Amount("Wave Amount", Range(0,1)) = 0.5
        _Height("Wave Height", Range(0,1)) = 0.5
        _Foam("Foamline Thickness", Range(0,3)) = 0.5

    }
        SubShader
    {
        Tags{ "RenderType" = "Opaque"  "Queue" = "Transparent" }
        LOD 100
        Blend SrcAlpha OneMinusSrcAlpha
      
        Pass
    {
        CGPROGRAM
#pragma vertex vert
#pragma fragment frag
        // make fog work
#pragma multi_compile_fog

#include "UnityCG.cginc"

        struct appdata
    {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
    };

    struct v2f
    {
        float2 uv : TEXCOORD0;
        UNITY_FOG_COORDS(2)
        float4 vertex : SV_POSITION;
        float4 scrPos : TEXCOORD1;//
    };

    float4 _Tint;
    uniform sampler2D _CameraDepthTexture;//Depth Texture
    sampler2D _MainTex;//
    float4 _MainTex_ST;
    float _Speed, _Amount, _Height, _Foam;//

    v2f vert(appdata v)
    {
        v2f o;
        v.vertex.y += sin(_Time.z * _Speed + (v.vertex.x * v.vertex.z * _Amount)) * _Height;//movement
        o.vertex = UnityObjectToClipPos(v.vertex);
        o.uv = TRANSFORM_TEX(v.uv, _MainTex);
        o.scrPos = ComputeScreenPos(o.vertex);// grab position on screen
        UNITY_TRANSFER_FOG(o,o.vertex);

        return o;
    }

    fixed4 frag(v2f i) : SV_Target
    {
        // sample the texture

        half4 col = tex2D(_MainTex, i.uv) * _Tint;// texture times tint;
      
        half depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos))); // depth
        half4 foamLine = 1 - saturate(_Foam * (depth - i.scrPos.w));// foam line by comparing depth and screenposition
        col += foamLine * _Tint; // add the foam line and tint to the texture
      
        UNITY_APPLY_FOG(i.fogCoord, col);
        return col;
    }
        ENDCG
    }
    }
}

What I’m doing wrong? I mean… I think that the problem is in depth buffer that works different in OpenGL, but can’t make it work anyway, its frustrating.

Thanks and sorry for my bad English.

Can you add yourCameraVariable.depthTextureMode |= DepthTextureMode.Depth. The post processing probably enabled the depth buffer.

I did it.

public class cameraDepthEn : MonoBehaviour
{
    [ExecuteInEditMode]
    public class RenderDepthBuffer : MonoBehaviour
    {
        public void Start()
        {
            GetComponent<Camera>().depthTextureMode = DepthTextureMode.Depth;
        }
    }
}

Tried with Post Processing disabled and removed, but it still doesn’t work. I changed the platform to PC and it’s doing the same: working with Post Processing and not working without it. Maybe the problem is because of forward rendering.

Thanks for the response.