From 21e186f75b504d832d9c7bef0456edd7d5d3155e Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 8 Sep 2021 10:52:35 +0800 Subject: +behavior design --- .../Core/Includes/AtmosphericHeightFog.cginc | 151 +++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 Assets/Art/BOXOPHOBIC/Atmospheric Height Fog/Core/Includes/AtmosphericHeightFog.cginc (limited to 'Assets/Art/BOXOPHOBIC/Atmospheric Height Fog/Core/Includes/AtmosphericHeightFog.cginc') diff --git a/Assets/Art/BOXOPHOBIC/Atmospheric Height Fog/Core/Includes/AtmosphericHeightFog.cginc b/Assets/Art/BOXOPHOBIC/Atmospheric Height Fog/Core/Includes/AtmosphericHeightFog.cginc new file mode 100644 index 00000000..4a1cb269 --- /dev/null +++ b/Assets/Art/BOXOPHOBIC/Atmospheric Height Fog/Core/Includes/AtmosphericHeightFog.cginc @@ -0,0 +1,151 @@ +/* + +// Add the following directives to your shader for directional and noise support + +#include "Assets/BOXOPHOBIC/Atmospheric Height Fog/Core/Library/AtmosphericHeightFog.cginc" +#pragma multi_compile AHF_NOISEMODE_OFF AHF_NOISEMODE_PROCEDURAL3D + +// Apply Atmospheric Height Fog to transparent shaders like this +// Where finalColor is the shader output color, fogParams.rgb is the fog color and fogParams.a is the fog mask + +float4 fogParams = GetAtmosphericHeightFog(i.worldPos); +return ApplyAtmosphericHeightFog(finalColor, fogParams); + +*/ + +#ifndef ATMOSPHERIC_HEIGHT_FOG_INCLUDED +#define ATMOSPHERIC_HEIGHT_FOG_INCLUDED + +#include "UnityCG.cginc" +#include "UnityShaderVariables.cginc" + +uniform half4 AHF_FogColorStart; +uniform half4 AHF_FogColorEnd; +uniform half AHF_FogDistanceStart; +uniform half AHF_FogDistanceEnd; +uniform half AHF_FogDistanceFalloff; +uniform half AHF_FogColorDuo; +uniform half4 AHF_DirectionalColor; +uniform half3 AHF_DirectionalDir; +uniform half AHF_DirectionalIntensity; +uniform half AHF_DirectionalFalloff; +uniform half3 AHF_FogAxisOption; +uniform half AHF_FogHeightEnd; +uniform half AHF_FogHeightStart; +uniform half AHF_FogHeightFalloff; +uniform half AHF_FogLayersMode; +uniform half AHF_NoiseScale; +uniform half3 AHF_NoiseSpeed; +uniform half AHF_NoiseDistanceEnd; +uniform half AHF_NoiseIntensity; +uniform half AHF_NoiseModeBlend; +uniform half AHF_FogIntensity; + +float3 mod3D289(float3 x) { return x - floor(x / 289.0) * 289.0; } +float4 mod3D289(float4 x) { return x - floor(x / 289.0) * 289.0; } +float4 permute(float4 x) { return mod3D289((x * 34.0 + 1.0) * x); } +float4 taylorInvSqrt(float4 r) { return 1.79284291400159 - r * 0.85373472095314; } + +float snoise(float3 v) +{ + const float2 C = float2(1.0 / 6.0, 1.0 / 3.0); + float3 i = floor(v + dot(v, C.yyy)); + float3 x0 = v - i + dot(i, C.xxx); + float3 g = step(x0.yzx, x0.xyz); + float3 l = 1.0 - g; + float3 i1 = min(g.xyz, l.zxy); + float3 i2 = max(g.xyz, l.zxy); + float3 x1 = x0 - i1 + C.xxx; + float3 x2 = x0 - i2 + C.yyy; + float3 x3 = x0 - 0.5; + i = mod3D289(i); + float4 p = permute(permute(permute(i.z + float4(0.0, i1.z, i2.z, 1.0)) + i.y + float4(0.0, i1.y, i2.y, 1.0)) + i.x + float4(0.0, i1.x, i2.x, 1.0)); + float4 j = p - 49.0 * floor(p / 49.0); // mod(p,7*7) + float4 x_ = floor(j / 7.0); + float4 y_ = floor(j - 7.0 * x_); // mod(j,N) + float4 x = (x_ * 2.0 + 0.5) / 7.0 - 1.0; + float4 y = (y_ * 2.0 + 0.5) / 7.0 - 1.0; + float4 h = 1.0 - abs(x) - abs(y); + float4 b0 = float4(x.xy, y.xy); + float4 b1 = float4(x.zw, y.zw); + float4 s0 = floor(b0) * 2.0 + 1.0; + float4 s1 = floor(b1) * 2.0 + 1.0; + float4 sh = -step(h, 0.0); + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + float3 g0 = float3(a0.xy, h.x); + float3 g1 = float3(a0.zw, h.y); + float3 g2 = float3(a1.xy, h.z); + float3 g3 = float3(a1.zw, h.w); + float4 norm = taylorInvSqrt(float4(dot(g0, g0), dot(g1, g1), dot(g2, g2), dot(g3, g3))); + g0 *= norm.x; + g1 *= norm.y; + g2 *= norm.z; + g3 *= norm.w; + float4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + m = m * m; + m = m * m; + float4 px = float4(dot(x0, g0), dot(x1, g1), dot(x2, g2), dot(x3, g3)); + return 42.0 * dot(m, px); +} + +// Returns the fog color and alpha based on world position +float4 GetAtmosphericHeightFog(float3 positionWS) +{ + float4 finalColor; + + float3 WorldPosition = positionWS; + + float3 WorldPosition2_g1 = WorldPosition; + float temp_output_7_0_g860 = AHF_FogDistanceStart; + half FogDistanceMask12_g1 = pow(abs(saturate(((distance(WorldPosition2_g1, _WorldSpaceCameraPos) - temp_output_7_0_g860) / (AHF_FogDistanceEnd - temp_output_7_0_g860)))), AHF_FogDistanceFalloff); + float3 lerpResult258_g1 = lerp((AHF_FogColorStart).rgb, (AHF_FogColorEnd).rgb, (saturate((FogDistanceMask12_g1 - 0.5)) * AHF_FogColorDuo)); + float3 normalizeResult318_g1 = normalize((WorldPosition2_g1 - _WorldSpaceCameraPos)); + float dotResult145_g1 = dot(normalizeResult318_g1, AHF_DirectionalDir); + half DirectionalMask30_g1 = pow(abs(((dotResult145_g1*0.5 + 0.5) * AHF_DirectionalIntensity)), AHF_DirectionalFalloff); + float3 lerpResult40_g1 = lerp(lerpResult258_g1, (AHF_DirectionalColor).rgb, DirectionalMask30_g1); + float3 temp_output_2_0_g859 = lerpResult40_g1; + float3 gammaToLinear3_g859 = GammaToLinearSpace(temp_output_2_0_g859); +#ifdef UNITY_COLORSPACE_GAMMA + float3 staticSwitch1_g859 = temp_output_2_0_g859; +#else + float3 staticSwitch1_g859 = gammaToLinear3_g859; +#endif + float3 temp_output_256_0_g1 = staticSwitch1_g859; + half3 AHF_FogAxisOption181_g1 = AHF_FogAxisOption; + float3 break159_g1 = (WorldPosition2_g1 * AHF_FogAxisOption181_g1); + float temp_output_7_0_g861 = AHF_FogHeightEnd; + half FogHeightMask16_g1 = pow(abs(saturate((((break159_g1.x + break159_g1.y + break159_g1.z) - temp_output_7_0_g861) / (AHF_FogHeightStart - temp_output_7_0_g861)))), AHF_FogHeightFalloff); + float lerpResult328_g1 = lerp((FogDistanceMask12_g1 * FogHeightMask16_g1), saturate((FogDistanceMask12_g1 + FogHeightMask16_g1)), AHF_FogLayersMode); + float simplePerlin3D193_g1 = snoise(((WorldPosition2_g1 * (1.0 / AHF_NoiseScale)) + (-AHF_NoiseSpeed * _Time.y))); + float temp_output_7_0_g863 = AHF_NoiseDistanceEnd; + half NoiseDistanceMask7_g1 = saturate(((distance(WorldPosition2_g1, _WorldSpaceCameraPos) - temp_output_7_0_g863) / (0.0 - temp_output_7_0_g863))); + float lerpResult198_g1 = lerp(1.0, (simplePerlin3D193_g1*0.5 + 0.5), (NoiseDistanceMask7_g1 * AHF_NoiseIntensity * AHF_NoiseModeBlend)); + half NoiseSimplex3D24_g1 = lerpResult198_g1; +#if defined(AHF_NOISEMODE_OFF) + float staticSwitch42_g1 = lerpResult328_g1; +#elif defined(AHF_NOISEMODE_PROCEDURAL3D) + float staticSwitch42_g1 = (lerpResult328_g1 * NoiseSimplex3D24_g1); +#else + float staticSwitch42_g1 = lerpResult328_g1; +#endif + float temp_output_43_0_g1 = (staticSwitch42_g1 * AHF_FogIntensity); + float4 appendResult114_g1 = (float4(temp_output_256_0_g1, temp_output_43_0_g1)); + + + finalColor = appendResult114_g1; + return finalColor; +} + +// Applies the fog +float3 ApplyAtmosphericHeightFog(float3 color, float4 fog) +{ + return float3(lerp(color.rgb, fog.rgb, fog.a)); +} + +float4 ApplyAtmosphericHeightFog(float4 color, float4 fog) +{ + return float4(lerp(color.rgb, fog.rgb, fog.a), color.a); +} + +#endif -- cgit v1.1-26-g67d0