You are on page 1of 2

Shader "Stylized/Sky"

{
Properties
{
[Header(Sun Disc)]
_SunDiscColor ("Color", Color) = (1, 1, 1, 1)
_SunDiscMultiplier ("Multiplier", float) = 25
_SunDiscExponent ("Exponent", float) = 125000

[Header(Sun Halo)]
_SunHaloColor ("Color", Color) = (0.8970588, 0.7760561, 0.6661981, 1)
_SunHaloExponent ("Exponent", float) = 125
_SunHaloContribution ("Contribution", Range(0, 1)) = 0.75

[Header(Horizon Line)]
_HorizonLineColor ("Color", Color) = (0.9044118, 0.8872592, 0.7913603, 1)
_HorizonLineExponent ("Exponent", float) = 4
_HorizonLineContribution ("Contribution", Range(0, 1)) = 0.25

[Header(Sky Gradient)]
_SkyGradientTop ("Top", Color) = (0.172549, 0.5686274, 0.6941177, 1)
_SkyGradientBottom ("Bottom", Color) = (0.764706, 0.8156863, 0.8509805)
_SkyGradientExponent ("Exponent", float) = 2.5
}
SubShader
{
Tags
{
"RenderType" = "Background"
"Queue" = "Background"
}
LOD 100

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

float3 _SunDiscColor;
float _SunDiscExponent;
float _SunDiscMultiplier;

float3 _SunHaloColor;
float _SunHaloExponent;
float _SunHaloContribution;

float3 _HorizonLineColor;
float _HorizonLineExponent;
float _HorizonLineContribution;

float3 _SkyGradientTop;
float3 _SkyGradientBottom;
float _SkyGradientExponent;

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float3 worldPosition : TEXCOORD1;
};

v2f vert (appdata v)


{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.worldPosition = mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}

fixed4 frag (v2f i) : SV_Target


{
// Masks.
float maskHorizon = dot(normalize(i.worldPosition), float3(0, 1,
0));
float maskSunDir = dot(normalize(i.worldPosition),
_WorldSpaceLightPos0.xyz);

// Sun disc.
float maskSun = pow(saturate(maskSunDir), _SunDiscExponent);
maskSun = saturate(maskSun * _SunDiscMultiplier);

// Sun halo.
float3 sunHaloColor = _SunHaloColor * _SunHaloContribution;
float bellCurve = pow(saturate(maskSunDir), _SunHaloExponent *
saturate(abs(maskHorizon)));
float horizonSoften = 1 - pow(1 - saturate(maskHorizon), 50);
sunHaloColor *= saturate(bellCurve * horizonSoften);

// Horizon line.
float3 horizonLineColor = _HorizonLineColor * saturate(pow(1 -
abs(maskHorizon), _HorizonLineExponent));
horizonLineColor = lerp(0, horizonLineColor,
_HorizonLineContribution);

// Sky gradient.
float3 skyGradientColor = lerp(_SkyGradientTop, _SkyGradientBottom,
pow(1 - saturate(maskHorizon), _SkyGradientExponent));

float3 finalColor = lerp(saturate(sunHaloColor + horizonLineColor +


skyGradientColor), _SunDiscColor, maskSun);
return float4(finalColor, 1);
}
ENDCG
}
}
}

You might also like