114 lines
4.0 KiB
Plaintext
114 lines
4.0 KiB
Plaintext
|
Shader "Hidden/Griffin/TerrainNormalMapRenderer"
|
||
|
{
|
||
|
Properties
|
||
|
{
|
||
|
_HeightMap("Height Map", 2D) = "black" {}
|
||
|
_Width("Width", Float) = 0
|
||
|
_Height("Height", Float) = 0
|
||
|
_Length("Length", Float) = 0
|
||
|
_TangentSpace("Tangent Space", Int) = 0
|
||
|
}
|
||
|
SubShader
|
||
|
{
|
||
|
Tags { "RenderType"="Transparent" }
|
||
|
Blend One Zero
|
||
|
|
||
|
Pass
|
||
|
{
|
||
|
CGPROGRAM
|
||
|
#pragma vertex vert
|
||
|
#pragma fragment frag
|
||
|
|
||
|
#include "UnityCG.cginc"
|
||
|
#include "TextureToolCommon.cginc"
|
||
|
|
||
|
struct appdata
|
||
|
{
|
||
|
float4 vertex : POSITION;
|
||
|
float2 uv : TEXCOORD0;
|
||
|
};
|
||
|
|
||
|
struct v2f
|
||
|
{
|
||
|
float4 vertex : SV_POSITION;
|
||
|
float2 uv : TEXCOORD0;
|
||
|
};
|
||
|
|
||
|
sampler2D _HeightMap;
|
||
|
float4 _HeightMap_TexelSize;
|
||
|
float _Width;
|
||
|
float _Height;
|
||
|
float _Length;
|
||
|
int _TangentSpace;
|
||
|
|
||
|
v2f vert (appdata v)
|
||
|
{
|
||
|
v2f o;
|
||
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
||
|
o.uv = v.uv;
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
float4 frag (v2f i) : SV_Target
|
||
|
{
|
||
|
float2 texel = _HeightMap_TexelSize.xy;
|
||
|
float2 uvLeft = i.uv - float2(texel.x, 0);
|
||
|
float2 uvUp = i.uv + float2(0, texel.y);
|
||
|
float2 uvRight = i.uv + float2(texel.x, 0);
|
||
|
float2 uvDown = i.uv - float2(0, texel.y);
|
||
|
float2 uvCenter = i.uv;
|
||
|
float2 uvLeftUp = i.uv - float2(texel.x, 0) + float2(0, texel.y);
|
||
|
float2 uvUpRight = i.uv + float2(0, texel.y) + float2(texel.x, 0);
|
||
|
float2 uvRightDown = i.uv + float2(texel.x, 0) - float2(0, texel.y);
|
||
|
float2 uvDownLeft = i.uv - float2(0, texel.y) - float2(texel.x, 0);
|
||
|
|
||
|
float leftHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvLeft).rg)*_Height;
|
||
|
float upHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvUp).rg) *_Height;
|
||
|
float rightHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvRight).rg) *_Height;
|
||
|
float downHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvDown).rg) *_Height;
|
||
|
float centerHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvCenter).rg) *_Height;
|
||
|
float leftUpHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvLeftUp).rg) *_Height;
|
||
|
float upRightHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvUpRight).rg) *_Height;
|
||
|
float rightDownHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvRightDown).rg) *_Height;
|
||
|
float downLeftHeight = GriffinDecodeFloatRG(tex2D(_HeightMap, uvDownLeft).rg) *_Height;
|
||
|
|
||
|
float3 left = float3(_Width*uvLeft.x, leftHeight, _Length*uvLeft.y);
|
||
|
float3 up = float3(_Width*uvUp.x, leftHeight, _Length*uvUp.y);
|
||
|
float3 right = float3(_Width*uvRight.x, leftHeight, _Length*uvRight.y);
|
||
|
float3 down = float3(_Width*uvDown.x, leftHeight, _Length*uvDown.y);
|
||
|
float3 center = float3(_Width*uvCenter.x, centerHeight, _Length*uvCenter.y);
|
||
|
float3 leftUp = float3(_Width*uvLeftUp.x, leftUpHeight, _Length*uvLeftUp.y);
|
||
|
float3 upRight = float3(_Width*uvUpRight.x, upRightHeight, _Length*uvUpRight.y);
|
||
|
float3 rightDown = float3(_Width*uvRightDown.x, rightDownHeight, _Length*uvRightDown.y);
|
||
|
float3 downLeft = float3(_Width*uvDownLeft.x, downLeftHeight, _Length*uvDownLeft.y);
|
||
|
|
||
|
float3 n0 = cross(left-center, leftUp-center);
|
||
|
float3 n1 = cross(up-center, upRight-center);
|
||
|
float3 n2 = cross(right-center, rightDown-center);
|
||
|
float3 n3 = cross(down-center, downLeft-center);
|
||
|
|
||
|
float3 n4 = cross(leftUp-center, up-center);
|
||
|
float3 n5 = cross(upRight-center, right-center);
|
||
|
float3 n6 = cross(rightDown-center, down-center);
|
||
|
float3 n7 = cross(downLeft-center, left-center);
|
||
|
|
||
|
float3 nc = (n0+n1+n2+n3+n4+n5+n6+n7)/8;
|
||
|
|
||
|
float3 n = _TangentSpace*float3(nc.x, nc.z, nc.y) + (1-_TangentSpace)*nc;
|
||
|
float3 normal = normalize(n);
|
||
|
|
||
|
float3 col = float3(
|
||
|
(normal.x + 1)/2,
|
||
|
(normal.y + 1)/2,
|
||
|
(normal.z + 1)/2);
|
||
|
#ifdef UNITY_COLORSPACE_GAMMA
|
||
|
return float4(col,1);
|
||
|
#else
|
||
|
return float4(GammaToLinearSpace(col.rgb), 1);
|
||
|
#endif
|
||
|
}
|
||
|
ENDCG
|
||
|
}
|
||
|
}
|
||
|
}
|