BITFALL/Assets/Polaris - Low Poly Ecosystem/Polaris - Low Poly Terrain .../Runtime/Shaders/Internal/LivePreview/ErosionLivePreview.shader

151 lines
4.4 KiB
Plaintext

Shader "Hidden/Griffin/ErosionGeometryLivePreview"
{
Properties
{
_Transparency ("Transparency", Range(0, 1)) = 0.5
_FadeDistance ("Fade Distance", Float) = 0.5
_SimulationData ("Sim Data", 2D) = "black" { }
_FalloffTexture ("Falloff Texture", 2D) = "black" { }
_HeightMap ("Height Map", 2D) = "black" { }
_Height ("Height", Float) = 1
_ErosionMap ("Erosion Map", 2D) = "black" { }
_ErosionSplat ("Erosion Splat", 2D) = "black" { }
_DepositionSplat ("Deposition Splat", 2D) = "black" { }
}
SubShader
{
Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
ZTest Off
Offset -1, -1
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#pragma shader_feature_local SHOW_TEXTURE
#pragma shader_feature_local SHOW_COLOR
#include "UnityCG.cginc"
#include "LivePreviewCommon.cginc"
struct appdata
{
float4 vertex: POSITION;
float2 uv: TEXCOORD0;
};
struct v2f
{
float2 uv: TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex: SV_POSITION;
float4 worldPos: TEXCOORD2;
float4 vertexColor: TEXCOORD3;
};
float _Transparency;
float _FadeDistance;
float4x4 _WorldToSim;
float4x4 _WorldToTerrainUV;
sampler2D _SimulationData;
sampler2D _FalloffTexture;
sampler2D _HeightMap;
float _Height;
sampler2D _ErosionMap;
sampler2D _ErosionSplat;
float4 _ErosionSplat_ST;
float _ErosionIntensity;
float4 _ErosionAlbedo;
sampler2D _DepositionSplat;
float4 _DepositionSplat_ST;
float _DepositionIntensity;
float4 _DepositionAlbedo;
v2f vert(appdata v)
{
v2f o;
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
float4 simPos = mul(_WorldToSim, float4(worldPos.xyz, 1));
float2 terrainUV = mul(_WorldToTerrainUV, float4(worldPos.xyz, 1)).xz;
float oldHeight = GriffinDecodeFloatRG(tex2Dlod(_HeightMap, float4(terrainUV, 0, 0)).rg) * _Height;
float2 simUv = simPos.xz + float2(0.5, 0.5);
float newHeight = tex2Dlod(_SimulationData, float4(simUv, 0, 0));
float f = saturate(2 * length(simUv - float2(0.5, 0.5)));
float falloff = tex2Dlod(_FalloffTexture, float4(f, 0.5, 0, 0)).r;
newHeight = lerp(oldHeight, newHeight, falloff);
v.vertex.y = newHeight;
o.uv = simUv;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.vertexColor = float4(
1, 1, 1,
clamp(abs(newHeight - oldHeight) / _FadeDistance, 0, 1)
);
UNITY_TRANSFER_FOG(o, o.vertex);
return o;
}
fixed4 frag(v2f i): SV_Target
{
int isInside = (i.uv.x >= 0) * (i.uv.x <= 1) * (i.uv.y >= 0) * (i.uv.y <= 1);
if (isInside == 0)
{
discard;
}
float4 color = 0;
#if SHOW_TEXTURE || SHOW_COLOR
float4 simPos = mul(_WorldToSim, float4(i.worldPos.xyz, 1));
float2 simUv = simPos.xz + float2(0.5, 0.5);
float2 terrainUV = mul(_WorldToTerrainUV, float4(i.worldPos.xyz, 1)).xz;
float f = saturate(2 * length(simUv - float2(0.5, 0.5)));
float falloff = tex2Dlod(_FalloffTexture, float4(f, 0.5, 0, 0)).r;
float2 erosionData = tex2D(_ErosionMap, simUv).rg;
float4 erosionColor = 0;
#if SHOW_TEXTURE
erosionColor = tex2D(_ErosionSplat, terrainUV * _ErosionSplat_ST.xy + _ErosionSplat_ST.zw);
#elif SHOW_COLOR
erosionColor = _ErosionAlbedo;
#endif
color = lerp(float4(0, 0, 0, 0), erosionColor, saturate(_ErosionIntensity * erosionData.r));
float4 depositionColor = 0;
#if SHOW_TEXTURE
depositionColor = tex2D(_DepositionSplat, terrainUV * _DepositionSplat_ST.xy + _DepositionSplat_ST.zw);
#elif SHOW_COLOR
depositionColor = _DepositionAlbedo;
#endif
color = lerp(color, depositionColor, saturate(_DepositionIntensity * erosionData.g));
color.a = saturate(falloff * max(_ErosionIntensity * erosionData.r, _DepositionIntensity * erosionData.g));
#else
float3 dpdx = ddx(i.worldPos);
float3 dpdy = ddy(i.worldPos);
float3 normal = normalize(cross(dpdy, dpdx));
color = float4((normal.x + 1) * 0.5, (normal.z + 1) * 0.5, (normal.y + 1) * 0.5, _Transparency * i.vertexColor.a);
#endif
UNITY_APPLY_FOG(i.fogCoord, col);
return color;
}
ENDCG
}
}
}