BITFALL/Assets/Polaris - Low Poly Ecosystem/Polaris - Low Poly Terrain .../Runtime/Shaders/Internal/ErosionTool/ErosionTexturer.shader

140 lines
3.8 KiB
Plaintext

Shader "Hidden/Polaris/ErosionTexturer"
{
Properties { }
CGINCLUDE
#pragma vertex vert
#include "UnityCG.cginc"
struct appdata
{
float4 vertex: POSITION;
float2 uv: TEXCOORD0;
};
struct v2f
{
float2 uv: TEXCOORD0;
float4 vertex: SV_POSITION;
float4 localPos: TEXCOORD1;
};
sampler2D _MainTex;
sampler2D _ErosionMap;
sampler2D _FalloffTexture;
float4 _ErosionAlbedo;
float _ErosionMetallic;
float _ErosionSmoothness;
float _ErosionChannelIndex;
float _ErosionIntensity;
float _ErosionExponent;
float4 _DepositionAlbedo;
float _DepositionMetallic;
float _DepositionSmoothness;
float _DepositionChannelIndex;
float _DepositionIntensity;
float _DepositionExponent;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.localPos = v.vertex;
return o;
}
ENDCG
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
Name "Splat"
CGPROGRAM
#pragma fragment fragSplat
float4 fragSplat(v2f i): SV_Target
{
float f = saturate(2 * length(i.uv - float2(0.5, 0.5)));
float falloff = tex2D(_FalloffTexture, float2(f, 0.5)).r;
float4 currentColor = tex2D(_MainTex, i.localPos);
float2 erosionData = tex2D(_ErosionMap, i.uv);
float erosionStrength = saturate(pow(erosionData.r * _ErosionIntensity * falloff, _ErosionExponent));
float4 erosionChannel = float4(_ErosionChannelIndex == 0, _ErosionChannelIndex == 1, _ErosionChannelIndex == 2, _ErosionChannelIndex == 3);
currentColor = lerp(currentColor, erosionChannel, erosionStrength);
float depositionStrength = saturate(pow(erosionData.g * _DepositionIntensity * falloff, _DepositionExponent));
float4 depositionChannel = float4(_DepositionChannelIndex == 0, _DepositionChannelIndex == 1, _DepositionChannelIndex == 2, _DepositionChannelIndex == 3);
currentColor = lerp(currentColor, depositionChannel, depositionStrength);
return currentColor;
}
ENDCG
}
Pass
{
Name "Albedo"
CGPROGRAM
#pragma fragment fragAlbedo
float4 fragAlbedo(v2f i): SV_Target
{
float f = saturate(2 * length(i.uv - float2(0.5, 0.5)));
float falloff = tex2D(_FalloffTexture, float2(f, 0.5)).r;
float4 currentColor = tex2D(_MainTex, i.localPos);
float2 erosionData = tex2D(_ErosionMap, i.uv);
float erosionStrength = saturate(pow(erosionData.r * _ErosionIntensity * falloff, _ErosionExponent));
currentColor = lerp(currentColor, _ErosionAlbedo, erosionStrength);
float depositionStrength = saturate(pow(erosionData.g * _DepositionIntensity * falloff, _DepositionExponent));
currentColor = lerp(currentColor, _DepositionAlbedo, depositionStrength);
return currentColor;
}
ENDCG
}
Pass
{
Name "Metallic Smoothness"
CGPROGRAM
#pragma fragment fragMetallicSmoothness
float4 fragMetallicSmoothness(v2f i): SV_Target
{
float f = saturate(2 * length(i.uv - float2(0.5, 0.5)));
float falloff = tex2D(_FalloffTexture, float2(f, 0.5)).r;
float4 currentColor = tex2D(_MainTex, i.localPos);
float2 erosionData = tex2D(_ErosionMap, i.uv);
float erosionStrength = saturate(pow(erosionData.r * _ErosionIntensity * falloff, _ErosionExponent));
float4 targetMS = float4(_ErosionMetallic, currentColor.g, currentColor.b, _ErosionSmoothness);
currentColor = lerp(currentColor, targetMS, erosionStrength);
float depositionStrength = saturate(pow(erosionData.g * _DepositionIntensity * falloff, _DepositionExponent));
targetMS = float4(_DepositionMetallic, currentColor.g, currentColor.b, _DepositionSmoothness);
currentColor = lerp(currentColor, targetMS, depositionStrength);
return currentColor;
}
ENDCG
}
}
}