168 lines
5.3 KiB
Plaintext
168 lines
5.3 KiB
Plaintext
Shader "PWS/PW_Water_Under"
|
|
{
|
|
Properties
|
|
{
|
|
_WaveShoreClamp ("Shore Movment", Range ( 0.0, 1.0 ) ) = 0.1
|
|
_WaveLength ("Wave Length", Float ) = 64
|
|
_WaveSteepness ("Wave Steepness", Float ) = 0.3
|
|
_WaveSpeed ("Wave Speed", Float ) = 0.4
|
|
_WaveDirection ("Wave Direction", Vector ) = (1,0,0,0)
|
|
_WaveDirGlobal ("WaveDirToggle", Float ) = 1
|
|
_WaveBackwashToggle ("Wave Backwash Toggle", Float ) = 1
|
|
_WavePeakToggle ("Wave Peak Toggle", Float ) = 1
|
|
_RefractionToggle ("Refraction", Float ) = 1
|
|
|
|
[NoScaleOffset][Normal] _NormalLayer0 ("Normal Layer 0", 2D) = "bump" {}
|
|
_NormalLayer0Scale ("NormalLayer0 Scale", Range ( 0.0, 3.0 ) ) = 1.0
|
|
[NoScaleOffset][Normal] _NormalLayer1 ("Normal Layer 1", 2D) = "bump" {}
|
|
_NormalLayer1Scale ("NormalLayer1 Scale", Range ( 0.0, 3.0 ) ) = 1.0
|
|
|
|
_NormalTile ("Water Tiling", Float ) = 128
|
|
|
|
_UnderWaterColor ("UnderWater Color", Color) = (0.7,0.8,1.0,1)
|
|
_EdgeWaterColor ("UnderWater Color", Color) = (0.1,0.1,0.1,1)
|
|
_EdgeWaterDist ("Edge Fade Distance", Float ) = 5
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
Tags {"Queue" = "Transparent+1" "RenderType"="Transparent" }
|
|
LOD 100
|
|
|
|
Pass
|
|
{
|
|
Cull Front
|
|
ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
#pragma multi_compile_fog
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "UnityPBSLighting.cginc"
|
|
#include "PW_GeneralVars.cginc"
|
|
#include "PW_GeneralFuncs.cginc"
|
|
#include "PW_Water_Vars.cginc"
|
|
#include "PW_Water_Funcs.cginc"
|
|
|
|
struct appdata
|
|
{
|
|
float4 vertex : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
float3 normal : NORMAL;
|
|
float4 tangent : TANGENT;
|
|
};
|
|
|
|
struct v2f
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
float4 screenPos : TEXCOORD1;
|
|
float3 worldPos : TEXCOORD7;
|
|
float2 bumpuv0 : TEXCOORD2;
|
|
float2 bumpuv1 : TEXCOORD3;
|
|
half3 tspace0 : TEXCOORD8;
|
|
half3 tspace1 : TEXCOORD9;
|
|
half3 tspace2 : TEXCOORD10;
|
|
UNITY_FOG_COORDS(11)
|
|
};
|
|
|
|
v2f vert (appdata v)
|
|
{
|
|
v2f o;
|
|
|
|
o =(v2f)0;
|
|
|
|
// float _MinOffset = 0.02;
|
|
// float _OffsetAmount = 0.1;
|
|
|
|
float4 screenPos = ComputeScreenPos(UnityObjectToClipPos(v.vertex));
|
|
float sceneZ = LinearEyeDepth (tex2Dlod(_CameraDepthTexture, float4(screenPos.xy / screenPos.w, 0.0, 0.0)).r);
|
|
float objectZ = screenPos.w;
|
|
float shoreClamp = clamp ( saturate( (sceneZ - objectZ) / 32 ) + _WaveShoreClamp, 0.0, 1.0 );
|
|
|
|
float2 worldUVScale;
|
|
worldUVScale.x = PW_DEFAULT_TERRAIN_SCALE * PW_GLOBAL_SCALE;
|
|
worldUVScale.y = PW_DEFAULT_TERRAIN_SCALE * PW_GLOBAL_SCALE;
|
|
|
|
// before the displacment
|
|
float3 worldPos = mul ((float3x3)unity_ObjectToWorld, v.vertex.xyz );
|
|
o.worldPos = worldPos;
|
|
|
|
float3 v0 = worldPos;
|
|
float2 waveDir;
|
|
|
|
#ifdef _PW_SF_WAVEDIR_GLOBAL_ON
|
|
waveDir = _PW_Global_WindDirection.xz;
|
|
#else
|
|
waveDir = _WaveDirection.xz;
|
|
#endif
|
|
|
|
float steepness = _WaveSteepness;
|
|
float waveLength = _WaveLength * PW_DEFAULT_TERRAIN_SCALE * PW_GLOBAL_SCALE;
|
|
|
|
v0.y += EchoWave ( v0, waveDir, waveLength, _WaveSpeed, steepness, shoreClamp );
|
|
float2 perp;
|
|
perp.x = waveDir.y;
|
|
perp.y = -waveDir.x;
|
|
|
|
v0.y += EchoWave ( v0, perp, waveLength * 0.25, -_WaveSpeed, steepness * 0.66, shoreClamp );
|
|
|
|
waveDir = normalize ( ( perp + waveDir ) * 0.5 );
|
|
v0.y += EchoWave ( v0, waveDir, waveLength, _WaveSpeed, steepness * 0.33, shoreClamp );
|
|
|
|
v.vertex.xyz = mul ((float3x3)unity_WorldToObject, v0 );
|
|
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.screenPos = ComputeScreenPos( UnityObjectToClipPos ( v.vertex ) );
|
|
|
|
worldPos = mul ( unity_ObjectToWorld, v.vertex );
|
|
|
|
float2 worldMapUV = float2 ( 1.0, 1.0 ) - ( ( worldPos.xz * worldUVScale ) + half2 ( 0.5, 0.5 ) );
|
|
|
|
float timeScale = _Time.x * ( _WaveSpeed * 0.00033 );
|
|
|
|
float2 t;
|
|
t.x = waveDir.x * timeScale;
|
|
t.y = waveDir.y * timeScale;
|
|
|
|
o.bumpuv0 = ( worldMapUV - t ) * _NormalTile;
|
|
o.bumpuv1 = ( worldMapUV + t ) * _NormalTile * 0.333;
|
|
|
|
UNITY_TRANSFER_FOG(o,o.vertex);
|
|
return o;
|
|
}
|
|
|
|
half4 frag (v2f i) : SV_Target
|
|
{
|
|
// sample the texture
|
|
half4 col = half4(1,1,1,1);
|
|
|
|
half3 bump1 = UnpackScaleNormal(tex2D( _NormalLayer0, i.bumpuv0 ),_NormalLayer0Scale );
|
|
half3 bump2 = UnpackScaleNormal(tex2D( _NormalLayer1, i.bumpuv1 ), _NormalLayer1Scale );
|
|
|
|
half3 bump = BlendUnpacked( bump1, bump2 );
|
|
|
|
half2 uvOffset = bump.xy * 0.5;
|
|
half2 uv = (i.screenPos.xy + uvOffset) / i.screenPos.w;
|
|
half3 underWaterColor = tex2D( _CameraOpaqueTexture, uv ).rgb;
|
|
|
|
col.rgb = underWaterColor;// * _UnderWaterColor;
|
|
|
|
half dist2Cam = distance(_WorldSpaceCameraPos.xyz, i.worldPos );
|
|
|
|
//col.rgb = WaterEdge ( col.rgb, i.worldPos, dist2Cam, 2 );
|
|
|
|
// apply fog
|
|
UNITY_APPLY_FOG(i.fogCoord, col);
|
|
UNITY_APPLY_FOG(i.fogCoord, col);
|
|
UNITY_APPLY_FOG(i.fogCoord, col);
|
|
return col;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
CustomEditor "PW_WaterUnderMaterialEditor"
|
|
}
|