468 lines
9.3 KiB
Plaintext
468 lines
9.3 KiB
Plaintext
|
|
Shader "Hidden/Amazing Assets/Terrain To Mesh/AllTerrainTextures"
|
|
{
|
|
Properties
|
|
{
|
|
_Color("", Color) = (1, 1, 1, 1)
|
|
_MainTex("", 2D) = "white" {}
|
|
|
|
_ControlMap ("", 2D) = "black" {}
|
|
_ChannelIndex ("", float) = 4
|
|
|
|
_PaintDiffuseMap ("", 2D) = "white" {}
|
|
_PaintNormalMap ("", 2D) = "bump" {}
|
|
_PaintNormalScale("", float) = 1
|
|
|
|
_PaintMaskMap ("", 2D) = "white" {}
|
|
|
|
_PaintSpecular("", Color) = (1, 1, 1, 1)
|
|
_PaintMetallic("", float) = 0
|
|
_PaintSmoothness("", float) = 1
|
|
_PaintSmoothnessFromDiffuseAlpha("", float) = 0
|
|
|
|
_PaintUVScaleOffset("", vector) = (1, 1, 0, 0)
|
|
_PaintSplitUVOffset("", vector) = (1, 1, 0, 0)
|
|
}
|
|
|
|
|
|
|
|
CGINCLUDE
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
|
|
float4 _Color;
|
|
|
|
sampler2D _MainTex;
|
|
float4 _MainTex_TexelSize;
|
|
|
|
sampler2D _ControlMap;
|
|
float _ChannelIndex;
|
|
|
|
sampler2D _PaintDiffuseMap;
|
|
sampler2D _PaintNormalMap;
|
|
float _PaintNormalClear;
|
|
float _PaintNormalScale;
|
|
|
|
sampler2D _PaintMaskMap;
|
|
float4 _PaintSpecular;
|
|
float _PaintMetallic;
|
|
float _PaintSmoothness;
|
|
int _PaintSmoothnessFromDiffuseAlpha;
|
|
float _PaintOccclusion;
|
|
|
|
float4 _MaskRemapMin;
|
|
float4 _MaskRemapMax;
|
|
|
|
float4 _PaintUVScaleOffset;
|
|
float4 _PaintSplitUVOffset;
|
|
|
|
float _FlipNormal;
|
|
float _WorldSpaceUV;
|
|
float2 _Remap01;
|
|
|
|
float _RotationDegree;
|
|
float _GammaToLinear;
|
|
|
|
|
|
float ControlValue(float2 uv)
|
|
{
|
|
if(_ChannelIndex < 0.5)
|
|
return tex2D (_ControlMap, uv).r;
|
|
else if(_ChannelIndex < 1.5)
|
|
return tex2D (_ControlMap, uv).g;
|
|
else if(_ChannelIndex < 2.5)
|
|
return tex2D (_ControlMap, uv).b;
|
|
else
|
|
return tex2D (_ControlMap, uv).a;
|
|
}
|
|
|
|
void TerrainToWorldUV(float2 uv, out float2 mapUV, out float2 controlUV)
|
|
{
|
|
_PaintUVScaleOffset.zw += _PaintUVScaleOffset.xy * _PaintSplitUVOffset.zw;
|
|
_PaintUVScaleOffset.xy *= _PaintSplitUVOffset.xy;
|
|
|
|
mapUV = float2(uv * _PaintUVScaleOffset.xy + _PaintUVScaleOffset.zw);
|
|
controlUV = float2(uv * _PaintSplitUVOffset.xy + _PaintSplitUVOffset.zw);
|
|
|
|
mapUV = lerp(mapUV, 1 - mapUV, _WorldSpaceUV);
|
|
controlUV = lerp(controlUV, 1 - controlUV, _WorldSpaceUV);
|
|
}
|
|
|
|
float2 RotateUV(float2 uv)
|
|
{
|
|
uv -= 0.5;
|
|
float s = sin(_RotationDegree);
|
|
float c = cos(_RotationDegree);
|
|
float2x2 rMatrix = float2x2(c, -s, s, c);
|
|
rMatrix *= 0.5;
|
|
rMatrix += 0.5;
|
|
rMatrix = rMatrix * 2 - 1;
|
|
uv.xy = mul(uv.xy, rMatrix);
|
|
uv += 0.5;
|
|
|
|
return uv;
|
|
}
|
|
|
|
float Remap01(float value)
|
|
{
|
|
value = (value - _Remap01.x) * (1.0 / (_Remap01.y - _Remap01.x));
|
|
|
|
return saturate(value);
|
|
}
|
|
|
|
float4 RemapMin01Max01(float4 value, float4 outMin, float4 outMax)
|
|
{
|
|
return outMin + value * (outMax - outMin);
|
|
}
|
|
|
|
float3 HeightToNormal(float2 uv)
|
|
{
|
|
float2 uvOffset = _MainTex_TexelSize * 1;
|
|
|
|
|
|
float K1 = Remap01(tex2D(_MainTex, uv + float2( uvOffset.x * -1, uvOffset.y)).r);
|
|
float K2 = Remap01(tex2D(_MainTex, uv + float2( 0, uvOffset.y)).r);
|
|
float K3 = Remap01(tex2D(_MainTex, uv + float2( uvOffset.x, uvOffset.y)).r);
|
|
|
|
float K4 = Remap01(tex2D(_MainTex, uv + float2( uvOffset.x * -1, 0)).r);
|
|
float K5 = Remap01(tex2D(_MainTex, uv + float2( 0, 0)).r);
|
|
float K6 = Remap01(tex2D(_MainTex, uv + float2( uvOffset.x, 0)).r);
|
|
|
|
float K7 = Remap01(tex2D(_MainTex, uv + float2( uvOffset.x * -1, uvOffset.y * -1)).r);
|
|
float K8 = Remap01(tex2D(_MainTex, uv + float2( 0, uvOffset.y * -1)).r);
|
|
float K9 = Remap01(tex2D(_MainTex, uv + float2( uvOffset.x, uvOffset.y * -1)).r);
|
|
|
|
|
|
|
|
|
|
float3 n;
|
|
n.x = 60 * (K9 - K7 + 2 * (K6 - K4) + K3 - K1) * -1;
|
|
n.y = 60 * (K1 - K7 + 2 * (K2 - K8) + K3 - K9) * -1;
|
|
n.z = 1.0;
|
|
|
|
if(_RotationDegree > 1)
|
|
n.xy *= -1;
|
|
|
|
n = normalize(n);
|
|
|
|
return n;
|
|
}
|
|
|
|
float4 fragBasemapDiffuse(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + tex2D (_PaintDiffuseMap, mapUV) * _Color * float4(1, 1, 1, _PaintSmoothness) * ControlValue(controlUV);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapNormal(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
|
|
float4 normal = tex2D (_PaintNormalMap, mapUV);
|
|
if(_PaintNormalClear > 0.5)
|
|
normal = float4(0.5f, 0.5f, 1, 1);
|
|
|
|
|
|
//[-1, 1]
|
|
normal = normal * 2 - 1;
|
|
|
|
//Flip normal
|
|
normal.yw *= _PaintNormalScale * lerp(1, -1, _FlipNormal);
|
|
|
|
//[0, 1]
|
|
normal = (normal + 1) / 2;
|
|
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + normal * ControlValue(controlUV);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapNormalUnpacked(v2f_img i) : SV_Target
|
|
{
|
|
float4 c = tex2D(_MainTex, i.uv);
|
|
|
|
c.rgb = UnpackNormal(c) * 0.5 + 0.5;
|
|
|
|
c.rgb = lerp(c.rgb, 1 - c.rgb, _WorldSpaceUV);
|
|
|
|
|
|
c.b = 1;
|
|
c.a = 1;
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapMask(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
float smoothnessValue = lerp(_PaintSmoothness, tex2D (_PaintDiffuseMap, mapUV).a, _PaintSmoothnessFromDiffuseAlpha);
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + RemapMin01Max01(tex2D (_PaintMaskMap, mapUV) * float4(_PaintMetallic, _PaintOccclusion, 0, smoothnessValue), _MaskRemapMin, _MaskRemapMax) * ControlValue(controlUV);
|
|
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapSpecular(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + float4(_PaintSpecular.rgb, 1) * float4(1, 1, 1, tex2D (_PaintDiffuseMap, mapUV).a * _PaintSmoothness) * ControlValue(controlUV);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapMetallic(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + float4(_PaintMetallic, 0, 0, tex2D (_PaintDiffuseMap, mapUV).a * _PaintSmoothness) * ControlValue(controlUV);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapSmoothness(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + float4(1, 0, 0, 1) * _PaintSmoothness * tex2D (_PaintDiffuseMap, mapUV).a * ControlValue(controlUV);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragBasemapOcclusion(v2f_img i) : SV_Target
|
|
{
|
|
float2 mapUV, controlUV;
|
|
TerrainToWorldUV(i.uv, mapUV, controlUV);
|
|
|
|
|
|
float4 c = tex2D(_MainTex, i.uv) + float4(RemapMin01Max01(tex2D (_PaintMaskMap, mapUV) * float4(0, _PaintOccclusion, 0, 0), _MaskRemapMin, _MaskRemapMax).ggg, 1) * ControlValue(controlUV);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragGeneric(v2f_img i) : SV_Target
|
|
{
|
|
i.uv = RotateUV(i.uv);
|
|
|
|
float4 c = tex2D(_MainTex, i.uv);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragGenericHolesmap(v2f_img i) : SV_Target
|
|
{
|
|
i.uv = RotateUV(i.uv);
|
|
|
|
float4 c = tex2D(_MainTex, i.uv);
|
|
|
|
return float4(c.xxx, 1);
|
|
}
|
|
|
|
float4 fragGenericHeightmap(v2f_img i) : SV_Target
|
|
{
|
|
i.uv = RotateUV(i.uv);
|
|
|
|
float c = tex2D(_MainTex, i.uv);
|
|
|
|
|
|
//Remap
|
|
c.r = Remap01(c.r);
|
|
|
|
|
|
if(_GammaToLinear > 0.5)
|
|
c = GammaToLinearSpaceExact(c);
|
|
|
|
return c;
|
|
}
|
|
|
|
float4 fragGenericHeightmapNormal(v2f_img i) : SV_Target
|
|
{
|
|
i.uv = RotateUV(i.uv);
|
|
|
|
float3 c = HeightToNormal(i.uv);
|
|
|
|
c.rgb = (c) * 0.5 + 0.5;
|
|
|
|
return float4(c, 1);
|
|
}
|
|
|
|
float4 fragHolesToBasemap(v2f_img i) : SV_Target
|
|
{
|
|
float4 c = tex2D(_MainTex, i.uv);
|
|
float4 holes = tex2D(_ControlMap, i.uv);
|
|
|
|
c.a = holes.r;
|
|
|
|
return c;
|
|
}
|
|
|
|
ENDCG
|
|
|
|
|
|
SubShader
|
|
{
|
|
Pass //0
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapDiffuse
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //1
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapNormal
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //2
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapNormalUnpacked
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //3
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapMask
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //4
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapSpecular
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //5
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapMetallic
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //6
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapSmoothness
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //7
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragBasemapOcclusion
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //8
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragGeneric
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //9
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragGenericHolesmap
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //10
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragGenericHeightmap
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //11
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragGenericHeightmapNormal
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
Pass //12
|
|
{
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment fragHolesToBasemap
|
|
ENDCG
|
|
|
|
} //Pass
|
|
|
|
} //SubShader
|
|
|
|
} //Shader
|