142 lines
4.3 KiB
Plaintext
142 lines
4.3 KiB
Plaintext
|
Shader "AwesomeTechnologies/Terrain/TerrainHeatmap"
|
||
|
{
|
||
|
Properties
|
||
|
{
|
||
|
[HideInInspector] _Control("Control (RGBA)", 2D) = "red" {}
|
||
|
_Selected("Selected color", Color) = (0.1,0.4,0.2,1)
|
||
|
_Background("Background color", Color) = (0.6,0.6,0.6,1)
|
||
|
[MaterialToggle] _UseTexture("Use Texture for fill", Float) = 0
|
||
|
_MinHeight("MinHeight", float) = 50
|
||
|
_MaxHeight("MaxHeight", float) = 100
|
||
|
_MinSteepness("MinSteepness", Range(0, 90)) = 10
|
||
|
_MaxSteepness("MaxSteepness", Range(0, 90)) = 25
|
||
|
_TerrainMinHeight("Terrain 0/Sea height", float) = 0
|
||
|
_TerrainMaxHeight("Terrain max height", float) = 1000
|
||
|
[MaterialToggle] _UseNoise("Use Noise", Float) = 0
|
||
|
[MaterialToggle] _InverseNoise("Inverse Noise", Float) = 0
|
||
|
_NoiseScale("Noise Scale", float) = 50
|
||
|
_NoiseOffset("Noise Offset",vector) = (0,0,0,0)
|
||
|
|
||
|
}
|
||
|
SubShader{
|
||
|
Tags{
|
||
|
"Queue" = "Geometry-100"
|
||
|
"RenderType" = "Opaque"
|
||
|
}
|
||
|
Lighting Off
|
||
|
CGPROGRAM
|
||
|
#pragma surface surf SimpleLambert vertex:SplatmapVert fullforwardshadows
|
||
|
#pragma multi_compile_fog
|
||
|
#pragma target 4.0
|
||
|
#pragma exclude_renderers gles vulkan
|
||
|
#include "UnityPBSLighting.cginc"
|
||
|
#pragma multi_compile __ _TERRAIN_NORMAL_MAP
|
||
|
|
||
|
sampler2D _Control;
|
||
|
float4 _Control_ST;
|
||
|
half4 _Selected;
|
||
|
half4 _Background;
|
||
|
float _MinHeight;
|
||
|
float _MaxHeight;
|
||
|
float _MinSteepness;
|
||
|
float _MaxSteepness;
|
||
|
float _TerrainMinHeight;
|
||
|
float _TerrainMaxHeight;
|
||
|
|
||
|
float _UseNoise;
|
||
|
float _InverseNoise;
|
||
|
float _NoiseScale;
|
||
|
float4 _NoiseOffset;
|
||
|
|
||
|
uniform float _HeightCurve[256];
|
||
|
uniform float _SteepnessCurve[256];
|
||
|
|
||
|
struct Input
|
||
|
{
|
||
|
float2 tc_Control : TEXCOORD4;
|
||
|
float3 worldPos;
|
||
|
float3 worldNormal;
|
||
|
UNITY_FOG_COORDS(5)
|
||
|
};
|
||
|
|
||
|
void SplatmapVert(inout appdata_full v, out Input data)
|
||
|
{
|
||
|
UNITY_INITIALIZE_OUTPUT(Input, data);
|
||
|
data.tc_Control = TRANSFORM_TEX(v.texcoord, _Control);
|
||
|
float4 pos = UnityObjectToClipPos(v.vertex);
|
||
|
UNITY_TRANSFER_FOG(data, pos);
|
||
|
v.tangent.xyz = cross(v.normal, float3(0, 0, 1));
|
||
|
v.tangent.w = -1;
|
||
|
}
|
||
|
|
||
|
half4 LightingSimpleLambert(SurfaceOutput s, half3 lightDir, half atten) {
|
||
|
half NdotL = dot(s.Normal, lightDir);
|
||
|
half4 c;
|
||
|
//c.rgb = s.Albedo *_LightColor0.rgb * (NdotL * atten * 2);
|
||
|
c.rgb = s.Albedo * (NdotL * 2);
|
||
|
c.a = s.Alpha;
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
float Perlin2D(float2 P)
|
||
|
{
|
||
|
// https://github.com/BrianSharpe/Wombat/blob/master/Perlin2D.glsl
|
||
|
P = P * 2 + float2(5000, 5000);
|
||
|
// establish our grid cell and unit position
|
||
|
float2 Pi = floor(P);
|
||
|
float4 Pf_Pfmin1 = P.xyxy - float4(Pi, Pi + 1.0);
|
||
|
|
||
|
// calculate the hash
|
||
|
float4 Pt = float4(Pi.xy, Pi.xy + 1.0);
|
||
|
|
||
|
Pt = Pt - floor(Pt * (1.0 / 71.0)) * 71.0;
|
||
|
Pt += float2(26.0, 161.0).xyxy;
|
||
|
Pt *= Pt;
|
||
|
Pt = Pt.xzxz * Pt.yyww;
|
||
|
|
||
|
float4 hash_x = frac(Pt * (1.0 / 951.135664));
|
||
|
float4 hash_y = frac(Pt * (1.0 / 642.949883));
|
||
|
|
||
|
// calculate the gradient results
|
||
|
float4 grad_x = hash_x - 0.49999;
|
||
|
float4 grad_y = hash_y - 0.49999;
|
||
|
float4 grad_results = rsqrt(grad_x * grad_x + grad_y * grad_y) * (grad_x * Pf_Pfmin1.xzxz + grad_y * Pf_Pfmin1.yyww);
|
||
|
|
||
|
// Classic Perlin Interpolation
|
||
|
grad_results *= 1.4142135623730950488016887242097; // scale things to a strict -1.0->1.0 range *= 1.0/sqrt(0.5)
|
||
|
|
||
|
float2 blend = Pf_Pfmin1.xy * Pf_Pfmin1.xy * Pf_Pfmin1.xy * (Pf_Pfmin1.xy * (Pf_Pfmin1.xy * 6.0 - 15.0) + 10.0);
|
||
|
float4 blend2 = float4(blend, float2(1.0 - blend));
|
||
|
|
||
|
return dot(grad_results, blend2.zxzx * blend2.wwyy);
|
||
|
}
|
||
|
|
||
|
void surf(Input IN, inout SurfaceOutput o)
|
||
|
{
|
||
|
float steepness = acos(dot(IN.worldNormal, float3(0, 1, 0))) * 57.29578;
|
||
|
float height = IN.worldPos.y -_TerrainMinHeight;
|
||
|
float normalizedHeight = saturate(height / (_TerrainMaxHeight - _TerrainMinHeight));
|
||
|
float normalizedSteepness = steepness / 90;
|
||
|
|
||
|
float sampledHeight = _HeightCurve[floor(normalizedHeight * 255)];
|
||
|
float sampledSteepness = _SteepnessCurve[floor(normalizedSteepness * 255)];
|
||
|
float combinedValue = sampledHeight * sampledSteepness;
|
||
|
|
||
|
if (_UseNoise > 0.5) {
|
||
|
if (_InverseNoise > 0.5) {
|
||
|
combinedValue = combinedValue * (1 - Perlin2D((IN.worldPos.xz + _NoiseOffset.xz) / _NoiseScale));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
combinedValue = combinedValue * Perlin2D((IN.worldPos.xz + _NoiseOffset.xz) / _NoiseScale);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
o.Albedo = lerp(_Background, _Selected, combinedValue);
|
||
|
o.Alpha = 1;
|
||
|
}
|
||
|
ENDCG
|
||
|
}
|
||
|
Dependency "BaseMapShader" = "AwesomeTechnologies/Terrain/TerrainHeatmap"
|
||
|
Fallback "Nature/Terrain/Diffuse"
|
||
|
}
|