Files
2025-06-09 23:23:13 +08:00

109 lines
3.3 KiB
Plaintext

Shader "Hidden/MicroVerse/SDFToMask"
{
Properties
{
_MainTex ("Heightmap Texture", 2D) = "white" {}
_SplineSDF("Spline SDF", 2D) = "black" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma shader_feature_local _ _TREATASAREA
#pragma shader_feature_local_fragment _ _SPLINECURVETREEWEIGHT
#pragma shader_feature_local_fragment _ _SPLINECURVEDETAILWEIGHT
struct vertexInput
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
sampler2D _SplineSDF;
sampler2D _SplineTreeWeight;
sampler2D _SplineDetailWeight;
float _TreeWidth;
float _TreeSmoothness;
float _DetailWidth;
float _DetailSmoothness;
float _HeightWidth;
float _HeightSmoothness;
float _SplatWidth;
float _SplatSmoothness;
v2f vert(vertexInput v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
float4 frag(v2f i) : SV_Target
{
float4 curMask = tex2D(_MainTex, i.uv);
float2 data = tex2D(_SplineSDF, i.uv).xy;
float height = 1.0 - smoothstep(_HeightWidth, _HeightWidth + _HeightSmoothness, data.g);
float splat = 1.0 - smoothstep(_SplatWidth, _SplatWidth + _SplatSmoothness, data.g);
float tree = 1.0 - smoothstep(_TreeWidth, _TreeWidth + _TreeSmoothness, data.g);
float detail = 1.0 - smoothstep(_DetailWidth, _DetailWidth + _DetailSmoothness, data.g);
#if _SPLINECURVETREEWEIGHT
float tcurve = saturate(data.g / (_TreeWidth + _TreeSmoothness));
tree *= 1.0 - tex2D(_SplineTreeWeight, float2(tcurve, 0.5)).r;
#endif
#if _SPLINECURVEDETAILWEIGHT
float dcurve = saturate(data.g / (_DetailWidth + _DetailSmoothness));
detail *= 1.0 - tex2D(_SplineDetailWeight, float2(dcurve, 0.5)).r;
#endif
#if _TREATASAREA
if (data.r < 0)
{
height = 1; splat = 1; tree = 1; detail = 1;
}
#endif
height = max(curMask.x, height);
splat = max(curMask.y, splat);
tree = max(curMask.z, tree);
detail = max(curMask.w, detail);
if (_HeightWidth >= 0)
curMask.x = height;
if (_SplatWidth >= 0)
curMask.y = splat;
if (_TreeWidth >= 0)
curMask.z = tree;
if (_DetailWidth >= 0)
curMask.w = detail;
return curMask;
}
ENDCG
}
}
}