168 lines
5.1 KiB
Plaintext
168 lines
5.1 KiB
Plaintext
Shader "Hidden/MicroVerse/NormalMapGen"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex("tex", 2D) = "black" {}
|
|
}
|
|
SubShader
|
|
{
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
#pragma shader_feature_local_fragment _ _PX
|
|
#pragma shader_feature_local_fragment _ _PY
|
|
#pragma shader_feature_local_fragment _ _NX
|
|
#pragma shader_feature_local_fragment _ _NY
|
|
|
|
#include_with_pragmas "UnityCG.cginc"
|
|
|
|
struct appdata
|
|
{
|
|
float4 vertex : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
struct v2f
|
|
{
|
|
float2 uv : TEXCOORD0;
|
|
float4 vertex : SV_POSITION;
|
|
};
|
|
|
|
sampler2D _Heightmap;
|
|
sampler2D _Heightmap_PX;
|
|
sampler2D _Heightmap_PY;
|
|
sampler2D _Heightmap_NX;
|
|
sampler2D _Heightmap_NY;
|
|
float4 _Heightmap_TexelSize;
|
|
|
|
|
|
v2f vert(appdata v)
|
|
{
|
|
v2f o;
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.uv = v.uv;
|
|
return o;
|
|
}
|
|
|
|
|
|
float3 GenerateNormal(float2 uv, float scale, float2 offset)
|
|
{
|
|
float height = UnpackHeightmap(tex2D(_Heightmap, uv));
|
|
float2 uvx = uv + float2(offset.x, 0.0);
|
|
float2 uvy = uv + float2(0.0, offset.y);
|
|
|
|
float x,y;
|
|
|
|
|
|
#if _PX
|
|
UNITY_BRANCH
|
|
if (uvx.x > 1)
|
|
{
|
|
uvx.x -= 1;
|
|
uvx.x += offset.x;
|
|
x = UnpackHeightmap(tex2D(_Heightmap_PX, uvx));
|
|
}
|
|
else
|
|
{
|
|
x = UnpackHeightmap(tex2D(_Heightmap, uvx));
|
|
}
|
|
#else
|
|
x = UnpackHeightmap(tex2D(_Heightmap, uvx));
|
|
#endif
|
|
|
|
#if _PY
|
|
UNITY_BRANCH
|
|
if (uvy.y > 1)
|
|
{
|
|
uvy.y -= 1;
|
|
uvy.y += offset.y;
|
|
y = UnpackHeightmap(tex2D(_Heightmap_PY, uvy));
|
|
}
|
|
else
|
|
{
|
|
y = UnpackHeightmap(tex2D(_Heightmap, uvy));
|
|
}
|
|
#else
|
|
y = UnpackHeightmap(tex2D(_Heightmap, uvy));
|
|
#endif
|
|
|
|
|
|
float2 dxy = height - float2(x, y);
|
|
|
|
dxy = dxy * scale / offset.xy;
|
|
return normalize(float4( dxy.x, dxy.y, 1.0, height)).xzy * 0.5 + 0.5;
|
|
}
|
|
|
|
float SampleHeight(float2 uv)
|
|
{
|
|
#if _PX
|
|
UNITY_BRANCH
|
|
if (uv.x > 1)
|
|
{
|
|
uv.x -= 1;
|
|
uv.x += _Heightmap_TexelSize.x;
|
|
return UnpackHeightmap(tex2D(_Heightmap_PX, uv));
|
|
}
|
|
#endif
|
|
#if _PY
|
|
UNITY_BRANCH
|
|
if (uv.y > 1)
|
|
{
|
|
uv.y -= 1;
|
|
uv.y += _Heightmap_TexelSize.y;
|
|
return UnpackHeightmap(tex2D(_Heightmap_PY, uv));
|
|
}
|
|
#endif
|
|
#if _NX
|
|
UNITY_BRANCH
|
|
if (uv.x < 0)
|
|
{
|
|
uv.x += 1;
|
|
uv.x -= _Heightmap_TexelSize.x;
|
|
return UnpackHeightmap(tex2D(_Heightmap_NX, uv));
|
|
}
|
|
#endif
|
|
#if _NY
|
|
UNITY_BRANCH
|
|
if (uv.y < 0)
|
|
{
|
|
uv.y += 1;
|
|
uv.y -= _Heightmap_TexelSize.y;
|
|
return UnpackHeightmap(tex2D(_Heightmap_NY, uv));
|
|
}
|
|
#endif
|
|
|
|
return UnpackHeightmap(tex2D(_Heightmap, uv));
|
|
}
|
|
|
|
float3 GenerateNormal5Tap(float2 uv, float2 offset)
|
|
{
|
|
float height = UnpackHeightmap(tex2D(_Heightmap, uv));
|
|
|
|
float x = SampleHeight(uv + float2(offset.x, 0.0));
|
|
float y = SampleHeight(uv + float2(0.0, offset.y));
|
|
float nx = SampleHeight(uv + float2(-offset.x, 0.0));
|
|
float ny = SampleHeight(uv + float2(0.0, -offset.y));
|
|
|
|
float2 dxy = height - float2(x, y);
|
|
dxy += float2(nx, ny) - height;
|
|
|
|
dxy = dxy * 1.0f / offset.xy;
|
|
dxy *= 0.5;
|
|
return normalize(float4(dxy.x, dxy.y, 1.0, height)).xzy * 0.5 + 0.5;
|
|
}
|
|
|
|
|
|
float4 frag(v2f i) : SV_Target
|
|
{
|
|
//float3 normal = GenerateNormal(i.uv, 1, _Heightmap_TexelSize.xy);
|
|
float3 normal = GenerateNormal5Tap(i.uv, _Heightmap_TexelSize.xy);
|
|
return float4(normal, 1);
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
} |