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

103 lines
2.4 KiB
Plaintext

Shader "Hidden/Griffin/VisibilityLivePreview2"
{
Properties
{
_Color ("Line Color", Color) = (1,1,1,1)
_HeightMap ("Height Map", 2D) = "black" {}
_Dimension ("Dimension", Vector) = (0,0,0,0)
_SubdivMap ("Subdiv Map", 2D) = "black" {}
_SubdivRange("Subdiv Range", Vector) = (0,0,0,0)
_Mask ("Mask", 2D) = "white" {}
}
SubShader
{
Pass
{
Tags { "RenderType"="AlphaTest" "Queue"="Overlay" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
ZTest Always
LOD 200
CGPROGRAM
#include "UnityCG.cginc"
#include "LivePreviewCommon.cginc"
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ USE_MASK
struct v2f
{
float4 pos : POSITION;
float2 heightMapUv : TEXCOORD1;
float4 worldPos : TEXCOORD2;
};
float4 _Color;
sampler2D _HeightMap;
float4 _Dimension;
float4 _BoundMin;
float4 _BoundMax;
sampler2D _SubdivMap;
float4 _SubdivRange;
sampler2D _Mask;
float4x4 _WorldPointToMask;
v2f vert(appdata_base v)
{
v2f output;
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
float4 heightMapUv = float4(
(worldPos.x-_BoundMin.x)/(_BoundMax.x-_BoundMin.x),
(worldPos.z-_BoundMin.z)/(_BoundMax.z-_BoundMin.z),
0, 0
);
float newHeight = GriffinDecodeFloatRG(tex2Dlod(_HeightMap, heightMapUv).rg)*_Dimension.y;
v.vertex.y = newHeight;
output.pos = UnityObjectToClipPos(v.vertex);
output.heightMapUv = heightMapUv;
output.worldPos = worldPos;
return output;
}
float4 frag(v2f input) : COLOR
{
#if USE_MASK
float2 maskUv = mul(_WorldPointToMask, input.worldPos).xz;
if (maskUv.x < 0) discard;
if (maskUv.x > 1) discard;
if (maskUv.y < 0) discard;
if (maskUv.y > 1) discard;
#endif
float visibilityValue = tex2D(_HeightMap, input.heightMapUv.xy).a;
if (visibilityValue >= 0.5)
discard;
float subdivValue = tex2D(_SubdivMap, input.heightMapUv.xy).r;
#if USE_MASK
float maskValue = tex2D(_Mask, maskUv).r;
#else
float maskValue = 1;
#endif
float4 col = _Color;
col.a *= col.a*maskValue*(subdivValue >= _SubdivRange.x)*(subdivValue <= _SubdivRange.y);
return col;
}
ENDCG
}
}
}