140 lines
3.8 KiB
Plaintext
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
|
|
}
|
|
}
|
|
}
|