b486678290
Library -Artifacts
188 lines
6.5 KiB
GLSL
188 lines
6.5 KiB
GLSL
Shader "Custom/3DNoiseTests"
|
|
{
|
|
Properties
|
|
{
|
|
_Color ("Color", Color) = (1,1,1,1)
|
|
_MainTex ("Albedo (RGB)", 2D) = "white" {}
|
|
_Glossiness ("Smoothness", Range(0,1)) = 0.5
|
|
_Metallic ("Metallic", Range(0,1)) = 0.0
|
|
_Octaves ("Octaves", Float) = 8
|
|
}
|
|
SubShader
|
|
{
|
|
Tags { "RenderType"="Opaque" }
|
|
LOD 200
|
|
|
|
CGPROGRAM
|
|
// Physically based Standard lighting model, and enable shadows on all light types
|
|
#pragma surface surf Standard fullforwardshadows
|
|
|
|
// Use shader model 3.0 target, to get nicer looking lighting
|
|
#pragma target 3.0
|
|
|
|
#include "Packages/com.unity.terrain-tools/Shaders/NoiseLib/Strata/Perlin.hlsl"
|
|
#include "Packages/com.unity.terrain-tools/Shaders/NoiseLib/Strata/Billow.hlsl"
|
|
#include "Packages/com.unity.terrain-tools/Shaders/NoiseLib/Strata/Value.hlsl"
|
|
#include "Packages/com.unity.terrain-tools/Shaders/NoiseLib/Strata/Voronoi.hlsl"
|
|
#include "Packages/com.unity.terrain-tools/Shaders/NoiseLib/Strata/Ridge.hlsl"
|
|
|
|
sampler2D _MainTex;
|
|
|
|
struct Input
|
|
{
|
|
float4 screenPos;
|
|
float3 worldPos;
|
|
float2 uv_MainTex;
|
|
};
|
|
|
|
half _Glossiness;
|
|
half _Metallic;
|
|
fixed4 _Color;
|
|
float _Iterations;
|
|
float _Octaves;
|
|
|
|
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
|
|
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
|
|
// #pragma instancing_options assumeuniformscaling
|
|
UNITY_INSTANCING_BUFFER_START(Props)
|
|
// put more per-instance properties here
|
|
UNITY_INSTANCING_BUFFER_END(Props)
|
|
|
|
#define NUM_KEYS 8
|
|
|
|
#define ERROR_COLOR float3(1, 0, 1)
|
|
|
|
float when_gt(float a, float b)
|
|
{
|
|
return max(0, sign( a - b ) );
|
|
}
|
|
|
|
struct Gradient
|
|
{
|
|
int type;
|
|
int colorsLength;
|
|
int alphasLength;
|
|
float4 colors[8];
|
|
float2 alphas[8];
|
|
};
|
|
|
|
Gradient Unity_Gradient_AD783C23 ()
|
|
{
|
|
Gradient g;
|
|
g.type = 0;
|
|
g.colorsLength = 8;
|
|
g.alphasLength = 2;
|
|
g.colors[0] = float4(0.2470588, 0.07388253, 0.01568627, 0);
|
|
g.colors[1] = float4(1, 0.7142625, 0.3679245, 0.1852903);
|
|
g.colors[2] = float4(0.3174247, 0.1844093, 0.09953334, 0.3911803);
|
|
g.colors[3] = float4(0.9426209, 0.346428, 0.009844661, 0.4676432);
|
|
g.colors[4] = float4(0.2924528, 0.1956704, 0.1213955, 0.5470665);
|
|
g.colors[5] = float4(0.8565952, 0.592296, 0.3008374, 0.6764782);
|
|
g.colors[6] = float4(0.3396226, 0.1743991, 0.08009968, 0.8735332);
|
|
g.colors[7] = float4(1, 1, 1, 1);
|
|
g.alphas[0] = float2(1, 0);
|
|
g.alphas[1] = float2(1, 1);
|
|
g.alphas[2] = float2(0, 0);
|
|
g.alphas[3] = float2(0, 0);
|
|
g.alphas[4] = float2(0, 0);
|
|
g.alphas[5] = float2(0, 0);
|
|
g.alphas[6] = float2(0, 0);
|
|
g.alphas[7] = float2(0, 0);
|
|
return g;
|
|
}
|
|
|
|
float3 Unity_SampleGradient_float(Gradient g, float Time)
|
|
{
|
|
float3 color = g.colors[0].rgb;
|
|
|
|
[unroll]
|
|
for (int c = 1; c < 8; c++)
|
|
{
|
|
float colorPos = saturate((Time - g.colors[c-1].w) / (g.colors[c].w - g.colors[c-1].w)) * step(c, g.colorsLength-1);
|
|
color = lerp(color, g.colors[c].rgb, lerp(colorPos, step(0.01, colorPos), g.type));
|
|
}
|
|
|
|
return color;
|
|
}
|
|
|
|
float3 get_gradient(float n)
|
|
{
|
|
float keys[NUM_KEYS] =
|
|
{
|
|
0,
|
|
.01,
|
|
.05,
|
|
.1,
|
|
.15,
|
|
.2,
|
|
1,
|
|
1
|
|
};
|
|
|
|
float3 colors[NUM_KEYS] =
|
|
{
|
|
float3(109, 62, 32),
|
|
float3(186, 159, 91),
|
|
float3(193, 178, 131),
|
|
float3(170, 104, 82),
|
|
float3(107, 45, 24),
|
|
float3(224, 167, 83),
|
|
float3(176, 178, 131),
|
|
float3(255, 0, 0)
|
|
};
|
|
|
|
float3 ret = ERROR_COLOR;
|
|
|
|
[unroll]
|
|
for(int i = 0; i < (NUM_KEYS - 1); ++i)
|
|
{
|
|
float startKey = keys[ i ];
|
|
float endKey = keys[ i + 1 ];
|
|
float3 startColor = colors[ i ];
|
|
float3 endColor = colors[ i + 1 ];
|
|
float3 c = lerp( startColor, endColor, saturate( ( n - startKey ) / ( endKey - startKey ) ) );
|
|
|
|
float gtStart = when_gt( n, startKey );
|
|
ret = lerp(ret, c, gtStart);
|
|
}
|
|
|
|
return ret / 255;
|
|
}
|
|
|
|
void surf (Input IN, inout SurfaceOutputStandard o)
|
|
{
|
|
StrataFractalInput fractalInput = GetStrataFractalInput();
|
|
|
|
//// cool warped stuff
|
|
// fractalInput.warpIterations = 0;
|
|
// float heightMask = noise_FbmPerlin( IN.worldPos.xz * .001, fractalInput );
|
|
// heightMask = abs(heightMask);
|
|
// fractalInput.warpIterations = 1;
|
|
// fractalInput.warpStrength = 4;
|
|
// float striation = noise_FbmPerlin( IN.worldPos.xz * heightMask * heightMask * heightMask * 2, fractalInput );
|
|
// striation = abs(striation);
|
|
|
|
// fractalInput.warpIterations = 0;
|
|
float3 worldPos = ApplyNoiseTransform( IN.worldPos.xyz );
|
|
// float heightMask = noise_FbmValue( worldPos * .001, fractalInput );
|
|
// fractalInput.warpIterations = 2;
|
|
// fractalInput.warpStrength = 4;
|
|
// float striation = noise_FbmValue( worldPos.y * heightMask * heightMask * heightMask * 2, fractalInput );
|
|
float striation = noise_StrataPerlin( worldPos.y, fractalInput );
|
|
float n = striation;
|
|
// n = heightMask;
|
|
|
|
// o.Albedo = get_gradient( striation );
|
|
o.Albedo = Unity_SampleGradient_float( Unity_Gradient_AD783C23(), striation );
|
|
// o.Albedo *= saturate(.5 * (noise_NoneValue(IN.screenPos.xy / IN.screenPos.w * 10000) + 1) + .5);
|
|
// o.Albedo = striation;
|
|
// o.Albedo = heightMask;
|
|
o.Metallic = _Metallic;
|
|
o.Smoothness = _Glossiness;
|
|
o.Alpha = 1;
|
|
}
|
|
ENDCG
|
|
}
|
|
FallBack "Diffuse"
|
|
}
|