Files
2026-06-22 16:18:34 +02:00

170 lines
3.2 KiB
Plaintext

// Copyright(C) Yan Verde - All Rights Reserved
// Copyright protected under Unity Asset Store EULA
// Refer to https://unity3d.com/legal/as_terms for more informations
// -----------------------------------------------------------------------------
// URP Water
// Author : Yan Verde
// Date : April 10, 2021
// -----------------------------------------------------------------------------
Shader "Hidden/URPWaterEffects"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_EdgeMaskSize ("EdgeMask Size", float) = 0.1
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
CGINCLUDE
CBUFFER_START(UnityPerMaterial)
sampler2D _MainTex;
float4 _MainTex_TexelSize;
float _EdgeMaskSize;
CBUFFER_END
sampler2D _BaseTex;
sampler2D _NormalMap;
float _NormalStrength;
float _BlurStrength;
float3 RemapNormals(float3 from, float3 to, float3 value) {
return (value - from) / (to - from);
}
float3 SafeNormalize(float3 inVec)
{
float dp3 = max(0.001, dot(inVec, inVec));
return inVec * rsqrt(dp3);
}
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
ENDCG
Pass
{
name "Base"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 frag(v2f i) : SV_Target
{
// Original
float3 duv = float3(_MainTex_TexelSize.xy, 0);
float4 v0 = tex2D(_MainTex, i.uv);
// Create Normal
float v1 = tex2D(_MainTex, i.uv - duv.xz).r;
float v2 = tex2D(_MainTex, i.uv + duv.xz).r;
float v3 = tex2D(_MainTex, i.uv - duv.zy).r;
float v4 = tex2D(_MainTex, i.uv + duv.zy).r;
float BlurMult = lerp(1, 16, _BlurStrength * 0.25);
float3 n = SafeNormalize(float3(v2 - v1, v4 - v3, 0.0)) * _NormalStrength * BlurMult;
// Blend with heightmap for smooth borders
n *= v0.rrr;
// Put back to 0-1 range in order to use non HDR texture.
n = saturate(RemapNormals(-1, 1, n));
return float4(n.x, n.y, v0.b, v0.a);
}
ENDCG
}
Pass
{
name "BlurV"
CGPROGRAM
#pragma vertex vertBlur
#pragma fragment fragBlur
#define BLUR_H
#include "UnityCG.cginc"
#include "URPWaterBlur.hlsl"
ENDCG
}
Pass
{
name "BlurV"
CGPROGRAM
#pragma vertex vertBlur
#pragma fragment fragBlur
#define BLUR_V
#include "UnityCG.cginc"
#include "URPWaterBlur.hlsl"
ENDCG
}
Pass
{
name "CompositeBlur"
CGPROGRAM
#pragma vertex vert
#pragma fragment fragComp
#include "UnityCG.cginc"
float4 fragComp(v2f i) : SV_Target
{
// Blurred / Normals
float4 NormalsTex = tex2D(_MainTex, i.uv);
// Original
float4 BaseTex = tex2D(_BaseTex, i.uv);
float2 edgeMaskUV = abs(i.uv * 2 - 1);
float edgeMask = 1 - max(edgeMaskUV.x, edgeMaskUV.y);
float mask = smoothstep(0, _EdgeMaskSize, edgeMask);
BaseTex.ba *= mask;
NormalsTex.a *= mask;
return float4(NormalsTex.rg, BaseTex.b, NormalsTex.a);
}
ENDCG
}
}
}