第一次提交
This commit is contained in:
@@ -0,0 +1,467 @@
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user