BITFALL/Assets/Polaris - Low Poly Ecosystem/Polaris - Low Poly Terrain .../Runtime/Shaders/Internal/TextureTool/NoiseMapGenerator.shader

222 lines
5.2 KiB
Plaintext

Shader "Hidden/Griffin/NoiseMapGenerator"
{
Properties
{
_Origin ("Origin", Vector) = (0,0,0,0)
_Frequency ("Frequency", Float) = 1
_Lacunarity ("Lacunarity", Float) = 2
_Persistence ("Persistence", Float) = 0.5
_Octaves ("Octaves", Int) = 1
_Seed ("Seed", float) = 12345
}
CGINCLUDE
#include "UnityCG.cginc"
#include "TextureToolCommon.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
float4 _Origin;
float _Frequency;
float _Lacunarity;
float _Persistence;
int _Octaves;
float _Seed;
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
float GetRandomNumber(float seed)
{
return seed*23.456*(1+ceil(seed)*12.345);
}
float4 fragPerlin (v2f i) : SV_Target
{
float2 refSize = float2(1,1);
float noiseValue = 0; //-1 to 1
float frequency = _Frequency;
float amplitude = 1;
float2 noisePos;
float2 uv;
float sampledNoise;
float rand = GetRandomNumber(_Seed);
float2 offset = float2(rand, rand);
for (int octave=0; octave<4; ++octave)
{
frequency = frequency*pow(_Lacunarity, octave);
amplitude = amplitude*pow(_Persistence, octave);
noisePos = _Origin.xy + i.uv*frequency + offset;
uv = float2(noisePos.x/refSize.x, noisePos.y/refSize.y);
sampledNoise = GradientNoise(uv)*amplitude*(octave<_Octaves);
noiseValue += sampledNoise;
}
noiseValue = (noiseValue+1)*0.5; //remap to 0-1
return float4(noiseValue, noiseValue, noiseValue, noiseValue);
}
float4 fragBillow (v2f i) : SV_Target
{
float2 refSize = float2(1,1);
float noiseValue = 0; //-1 to 1
float frequency = _Frequency;
float amplitude = 1;
float2 noisePos;
float2 uv;
float sampledNoise;
float rand = GetRandomNumber(_Seed);
float2 offset = float2(rand, rand);
for (int octave=0; octave<4; ++octave)
{
frequency = frequency*pow(_Lacunarity, octave);
amplitude = amplitude*pow(_Persistence, octave);
noisePos = _Origin.xy + i.uv*frequency + offset;
uv = float2(noisePos.x/refSize.x, noisePos.y/refSize.y);
sampledNoise = GradientNoise(uv)*amplitude*(octave<_Octaves);
noiseValue += abs(sampledNoise);
}
noiseValue = abs(noiseValue);
return float4(noiseValue, noiseValue, noiseValue, noiseValue);
}
float4 fragRidged (v2f i) : SV_Target
{
float2 refSize = float2(1,1);
float noiseValue = 0; //-1 to 1
float frequency = _Frequency;
float amplitude = 1;
float2 noisePos;
float2 uv;
float sampledNoise;
float rand = GetRandomNumber(_Seed);
float2 offset = float2(rand, rand);
for (int octave=0; octave<4; ++octave)
{
frequency = frequency*pow(_Lacunarity, octave);
amplitude = amplitude*pow(_Persistence, octave);
noisePos = _Origin.xy + i.uv*frequency + offset;
uv = float2(noisePos.x/refSize.x, noisePos.y/refSize.y);
sampledNoise = GradientNoise(uv)*amplitude*(octave<_Octaves);
noiseValue += abs(sampledNoise);
}
noiseValue = 1-abs(noiseValue);
return float4(noiseValue, noiseValue, noiseValue, noiseValue);
}
float4 fragVoronoi (v2f i) : SV_Target
{
float2 refSize = float2(1,1);
float noiseValue = 0; //0 to 1
float frequency = _Frequency;
float amplitude = 1;
float2 noisePos;
float2 uv;
float sampledNoise;
for (int octave=0; octave<4; ++octave)
{
frequency = frequency*pow(_Lacunarity, octave);
amplitude = amplitude*pow(_Persistence, octave);
uv = _Origin+i.uv;
sampledNoise = Voronoi(uv, _Seed, frequency)*amplitude*(octave<_Octaves);
noiseValue += sampledNoise;
}
return float4(noiseValue, noiseValue, noiseValue, noiseValue);
}
float4 fragValue (v2f i) : SV_Target
{
float2 refSize = float2(1,1);
float noiseValue = 0; //-1 to 1
float frequency = _Frequency;
float amplitude = 1;
float2 noisePos;
float2 uv;
float sampledNoise;
float rand = GetRandomNumber(_Seed);
float2 offset = float2(rand, rand);
for (int octave=0; octave<4; ++octave)
{
frequency = frequency*pow(_Lacunarity, octave);
amplitude = amplitude*pow(_Persistence, octave);
noisePos = _Origin.xy + i.uv*frequency + offset;
uv = float2(noisePos.x/refSize.x, noisePos.y/refSize.y);
sampledNoise = ValueNoise(uv)*amplitude*(octave<_Octaves);
noiseValue += sampledNoise;
}
noiseValue = (noiseValue+1)*0.5; //remap to 0-1
return float4(noiseValue, noiseValue, noiseValue, noiseValue);
}
ENDCG
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment fragPerlin
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment fragBillow
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment fragRidged
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment fragVoronoi
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment fragValue
ENDCG
}
}
}