2024-02-19 21:00:36 +03:00

155 lines
4.4 KiB
Plaintext

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Nature/Ocean"
{
Properties
{
_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)
_BumpMap ("Normals ", 2D) = "bump" {}
_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)
_WorldLightDir ("Specular light direction", Vector) = (0.0, 0.1, -0.5, 0.0)
_Shininess ("Shininess", Range (2.0, 500.0)) = 200.0
_DistortParams ("Distortions (Bump waves, Reflection, Fresnel power, Fresnel bias)", Vector) = (1.0 ,1.0, 2.0, 1.15)
_WaveLengthInverse("Wave Length", Float) = 10.0
_Intensity("Intensity", Float) = 4.0
_Periode("Periode", Float) = 1.0
}
CGINCLUDE
#include "UnityCG.cginc"
#include "WaterToolBox.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 viewInterpolator : TEXCOORD0;
float4 bumpCoords : TEXCOORD1;
float4 depth : TEXCOORD2;
float4 grabPassPos : TEXCOORD3;
float4 screenPos : TEXCOORD4;
UNITY_FOG_COORDS(5)
};
float4 _BaseColor;
float4 _ReflectionColor;
float4 _SpecularColor;
sampler2D _BumpMap;
sampler2D _RefractionTex;
uniform float4 _BumpDirection;
uniform float4 _BumpTiling;
uniform float4 _DistortParams;
uniform float4 _WorldLightDir;
uniform float _Shininess;
uniform float _FresnelScale;
uniform float _WaveLengthInverse;
uniform float _Intensity;
uniform float _Periode;
uniform sampler2D _CameraDepthTexture;
#define FRESNEL_POWER _DistortParams.z
#define FRESNEL_BIAS _DistortParams.w
#define PER_PIXEL_DISPLACE _DistortParams.x
v2f vert(appdata_full v)
{
v2f o;
half3 worldSpaceVertex = mul(unity_ObjectToWorld, v.vertex).xyz;
half2 tileableUv = worldSpaceVertex.xz;
o.bumpCoords.xyzw = (tileableUv.xyxy + _Time.xxxx * _BumpDirection.xyzw) * _BumpTiling.xyzw;
o.viewInterpolator.xyz = worldSpaceVertex - _WorldSpaceCameraPos;
v.vertex.y = waterHeight(_WaveLengthInverse, _Intensity, _Periode, worldSpaceVertex.xz) - worldSpaceVertex.y;
o.pos = UnityObjectToClipPos(v.vertex);
o.depth = ComputeScreenPos(o.pos);
ComputeScreenAndGrabPassPos(o.pos, o.screenPos, o.grabPassPos);
UNITY_TRANSFER_FOG(o,o.pos);
return o;
}
half4 frag( v2f 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));
half4 distortOffset = half4(worldNormal.xz * 0.24 * 10.0, 0, 0);
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));
worldNormal.xz *= _FresnelScale;
half refl2Refr = Fresnel(viewVector, worldNormal, FRESNEL_BIAS, FRESNEL_POWER);
float depthT = LinearEyeDepth(tex2Dproj(_CameraDepthTexture,
UNITY_PROJ_COORD(i.depth)).r);
float depth = depthT * 0.02 + 0.5 * refl2Refr;
depth = depth > 500 ? 0.3 : depth;
half4 baseColor = _BaseColor;
half4 reflectionColor = _ReflectionColor;
baseColor = lerp (lerp (rtRefractions, baseColor, baseColor.a), reflectionColor, refl2Refr);
baseColor = baseColor + spec * _SpecularColor;
baseColor.rgb += spec * _SpecularColor.rgb;
UNITY_APPLY_FOG(i.fogCoord, baseColor);
return baseColor;
}
ENDCG
Subshader
{
Tags {"RenderType"="Transparent" "Queue"="Transparent"}
Lod 200
ColorMask RGB
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ZTest LEqual
//ZWrite Off
Cull Off
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
ENDCG
}
}
Fallback "Transparent/Diffuse"
}