155 lines
4.4 KiB
Plaintext
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"
|
||
|
}
|