You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1207 lines
50 KiB
Plaintext

// Copyright(c) 2017 Funly LLC
//
// Author: Jason Ederle
// Description: Renders a customizable sky for a 3D skybox sphere.
// Contact: jason@funly.io
Shader "Funly/Sky Studio/Skybox/3D Standard" {
Properties {
// Gradient Sky.
_GradientSkyUpperColor("Sky Top Color", Color) = (.47, .45, .75, 1) // Color of sky.
_GradientSkyMiddleColor("Sky Middle Color", Color) = (1, 1, 1, 1) // Color in the middle of sky 3 way gradient.
_GradientSkyLowerColor("Sky Lower Color", Color) = (.7, .53, .69, 1) // Color of horizon.
_GradientFadeBegin("Horizon Fade Begin", Range(-1, 1)) = -.179 // Position to begin horizon fade into sky.
_GradientFadeEnd("Horizon Fade End", Range(-1, 1)) = .302 // Position to end horizon fade into sky.
_GradientFadeMiddlePosition("Horizon Fade Middle Position", Range(0, 1)) = .5 // Position of the middle gradient color.
// Shrink stars closer to horizon.
_HorizonScaleFactor("Star Horizon Scale Factor", Range(0, 1)) = .7
// Cubemap background.
[NoScaleOffset]_MainTex("Background Cubemap", CUBE) = "white" {} // Cubemap for custom background behind stars.
// Star fading.
_StarFadeBegin("Star Fade Begin", Range(-1, 1)) = .067 // Height to begin star fade in.
_StarFadeEnd("Star Fade End", Range(-1, 1)) = .36 // Height where all stars are faded in at.
// Star (Basic).
[NoScaleOffset]_StarBasicCubemap("Star Basic Cubemap", CUBE) = "black" {}
_StarBasicTwinkleSpeed("Star Basic Twinkle Speed", Range(0, 10)) = 5
_StarBasicTwinkleAmount("Star Basic Twinkle Amount", Range(0, 1)) = .75
_StarBasicOpacity("Star Basic Opacity", Range(0, 1)) = 1
_StarBasicTintColor("Star Basic Tint Color", Color) = (1, 1, 1, 1)
_StarBasicExponent("Star Basic Exponent", Range(.5, 5)) = 1.2
// Star Layer 1.
[NoScaleOffset]_StarLayer1Tex("Star 1 Texture", 2D) = "white" {}
_StarLayer1Color("Star Layer 1 - Color", Color) = (1, 1, 1, 1) // Color tint for stars.
_StarLayer1Density("Star Layer 1 - Star Density", Range(0, .05)) = .01 // Space between stars.
_StarLayer1MaxRadius("Star Layer 1 - Star Size", Range(0, .1)) = .007 // Max radius of stars.
_StarLayer1TwinkleAmount("Star Layer 1 - Twinkle Amount", Range(0, 1)) = .775 // Percent of star twinkle amount.
_StarLayer1TwinkleSpeed("Star Layer 1 - Twinkle Speed", float) = 2.0 // Twinkle speed.
_StarLayer1RotationSpeed("Star Layer 1 - Rotation Speed", float) = 2 // Rotation speed of stars.
_StarLayer1EdgeFade("Star Layer 1 - Edge Feathering", Range(0.0001, .9999)) = .2 // Softness of star blending with background.
_StarLayer1HDRBoost("Star Layer 1 - HDR Bloom Boost", Range(1, 10)) = 1.0 // Boost star colors so they glow with bloom filters.
_StarLayer1SpriteDimensions("Star Layer 1 Sprite Dimensions", Vector) = (0, 0, 0, 0) // Dimensions of columns (x), and rows (y) in sprite sheet.
_StarLayer1SpriteItemCount("Star Layer 1 Sprite Total Items", int) = 1 // Total number of items in sprite sheet.
_StarLayer1SpriteAnimationSpeed("Star Layer 1 Sprite Speed", int) = 1 // Speed of the sprite sheet animation.
[NoScaleOffset]_StarLayer1DataTex("Star Layer 1 - Data Image", 2D) = "black" {} // Data image with star positions.
// Star Layer 2. - See property descriptions from star layer 1.
[NoScaleOffset]_StarLayer2Tex("Star 2 Texture", 2D) = "white" {}
_StarLayer2Color("Star Layer 2 - Color", Color) = (1, .5, .96, 1)
_StarLayer2Density("Star Layer 2 - Star Density", Range(0, .05)) = .01
_StarLayer2MaxRadius("Star Layer 2 - Star Size", Range(0, .4)) = .014
_StarLayer2TwinkleAmount("Star Layer 2 - Twinkle Amount", Range(0, 1)) = .875
_StarLayer2TwinkleSpeed("Star Layer 2 - Twinkle Speed", float) = 3.0
_StarLayer2RotationSpeed("Star Layer 2 - Rotation Speed", float) = 2
_StarLayer2EdgeFade("Star Layer 2 - Edge Feathering", Range(0.0001, .9999)) = .2
_StarLayer2HDRBoost("Star Layer 2 - HDR Bloom Boost", Range(1, 10)) = 1.0
_StarLayer2SpriteDimensions("Star Layer 2 Sprite Dimensions", Vector) = (0, 0, 0, 0)
_StarLayer2SpriteItemCount("Star Layer 2 Sprite Total Items", int) = 1
_StarLayer2SpriteAnimationSpeed("Star Layer 2 Sprite Speed", int) = 1
[NoScaleOffset]_StarLayer2DataTex("Star Layer 2 - Data Image", 2D) = "black" {}
// Star Layer 3. - See property descriptions from star layer 1.
[NoScaleOffset]_StarLayer3Tex("Star 3 Texture", 2D) = "white" {}
_StarLayer3Color("Star Layer 3 - Color", Color) = (.22, 1, .55, 1)
_StarLayer3Density("Star Layer 3 - Star Density", Range(0, .05)) = .01
_StarLayer3MaxRadius("Star Layer 3 - Star Size", Range(0, .4)) = .01
_StarLayer3TwinkleAmount("Star Layer 3 - Twinkle Amount", Range(0, 1)) = .7
_StarLayer3TwinkleSpeed("Star Layer 3 - Twinkle Speed", float) = 1.0
_StarLayer3RotationSpeed("Star Layer 3 - Rotation Speed", float) = 2
_StarLayer3EdgeFade("Star Layer 3 - Edge Feathering", Range(0.0001, .9999)) = .2
_StarLayer3HDRBoost("Star Layer 3 - HDR Bloom Boost", Range(1, 10)) = 1.0
_StarLayer3SpriteDimensions("Star Layer 3 Sprite Dimensions", Vector) = (0, 0, 0, 0)
_StarLayer3SpriteItemCount("Star Layer 3 Sprite Total Items", int) = 1
_StarLayer3SpriteAnimationSpeed("Star Layer 3 Sprite Speed", int) = 1
[NoScaleOffset]_StarLayer3DataTex("Star Layer 3 - Data Image", 2D) = "black" {}
// Moon properties.
[NoScaleOffset]_MoonTex("Moon Texture", 2D) = "white" {} // Moon image.
_MoonColor("Moon Color", Color) = (.66, .65, .55, 1) // Moon tint color.
_MoonRadius("Moon Size", Range(0, 1)) = .1 // Radius of the moon.
_MoonEdgeFade("Moon Edge Feathering", Range(0.0001, .9999)) = .3 // Soften edges of moon texture.
_MoonHDRBoost("Moon HDR Bloom Boost", Range(1, 10)) = 1 // Control brightness for HDR bloom filter.
_MoonSpriteDimensions("Moon Sprite Dimensions", Vector) = (0, 0, 0, 0) // Dimensions of columns (x), and rows (y) in sprite sheet.
_MoonSpriteItemCount("Moon Sprite Total Items", int) = 1 // Total number of items in sprite sheet.
_MoonSpriteAnimationSpeed("Moon Sprite Speed", int) = 1 // Speed of the sprite sheet animation.
_MoonPosition("Moon Position" , Vector) = (0, 0, 0, 0) // Moon Position.
_MoonAlpha("Sun Alpha", Range(0.0, 1.0)) = 1 // Transparency of the sun, useful for blending transitions.
// Sun properties.
[NoScaleOffset]_SunTex("Sun Texture", 2D) = "white" {} // Sun image.
_SunColor("Sun Color", Color) = (.66, .65, .55, 1) // Sun tint color.
_SunRadius("Sun Size", Range(0, 1)) = .1 // Radius of the Sun.
_SunEdgeFade("Sun Edge Feathering", Range(0.0001, .9999)) = .3 // Soften edges of Sun texture.
_SunHDRBoost("Sun HDR Bloom Boost", Range(1, 10)) = 1 // Control brightness for HDR bloom filter.
_SunSpriteDimensions("Sun Sprite Dimensions", Vector) = (0, 0, 0, 0) // Dimensions of columns (x), and rows (y) in sprite sheet.
_SunSpriteItemCount("Sun Sprite Total Items", int) = 1 // Total number of items in sprite sheet.
_SunSpriteAnimationSpeed("Sun Sprite Speed", int) = 1 // Speed of the sprite sheet animation.
_SunPosition("Sun Position Data" , Vector) = (0, 0, 0, 0) // Sun position.
_SunAlpha("Sun Alpha", Range(0.0, 1.0)) = 1 // Transparency of the sun, useful for blending transitions.
// Noise Cloud properties.
[NoScaleOffset]_CloudNoiseTexture("Cloud Texture", 2D) = "black" {} // Cloud noise texture.
_CloudFadePosition("Cloud Fade Position", Range(0, .97)) = .74 // Position that the clouds will begin fading out at.
_CloudFadeAmount("Cloud Fade Amount", Range(0, 1)) = .5 // Amount of fade to clouds.
_CloudDensity("Cloud Density", Range(0, 1)) = .25 // Cloud density.
_CloudSpeed("Cloud Speed", Range(0, 1)) = .1 // Cloud speed.
_CloudDirection("Cloud Direction", Range(0, 6.283)) = 1.0 // Cloud direction.
_CloudHeight("Cloud Height", Range(0, 1)) = .5 // Cloud height, by scaling up/down texture.
_CloudTextureTiling("Cloud Tiling", Range(.01, 10)) = 2 // Cloud tiling which changes visible resolution.
_CloudColor1("Cloud 1 Color", Color) = (1, 1, 1, 1) // Cloud color 1.
_CloudColor2("Cloud 2 Color", Color) = (.6, .6, .6, 1) // Cloud color 2.
_CloudAlpha("Cloud Alpha", Range(0.0, 1.0)) = 1 // Transparency of the clouds, useful for blending transitions.
// Cubemap Clouds.
[NoScaleOffset]_CloudCubemapTexture("Cloud Cubemap", CUBE) = "clear" {} // Cloud custom texture.
_CloudCubemapRotationSpeed("Cloud Cubemap Rotation Speed", Range(-1, 1)) = .01 // Rotation speed and direction.
_CloudCubemapTintColor("Cloud Cubemap Tint Color", Color) = (1, 1, 1, 1) // Tint color.
_CloudCubemapHeight("Cloud Cubemap Height", Range(-1, 1)) = 0 // Cloud height
[NoScaleOffset]_CloudCubemapDoubleTexture("Cloud Double Cubemap", CUBE) = "clear" {} // Cloud custom texture.
_CloudCubemapDoubleLayerHeight("Cloud Cubemap Double Layer Offset", float) = 0 // Offset of the duplicate cloud layer.
_CloudCubemapDoubleLayerRotationSpeed("Cloud Cubemap Double Layer Rotation Speed", Range(-1, 1)) = .02
_CloudCubemapDoubleLayerTintColor("Cloud Cubemap Double Tint Color", Color) = (1, 1, 1, 1)
// Cubemap Normal Clouds.
[NoScaleOffset]_CloudCubemapNormalTexture("Cloud Cubemap Normal Texture", CUBE) = "clear" {} // Cubemap texture with normals.
_CloudCubemapNormalAmbientIntensity("Cloud Ambient Light Intensity", Range(0, 1)) = .2 // Ambient light intensity.
_CloudCubemapNormalRotationSpeed("Cloud Cubemap Normal Rotation Speed", Range(-1, 1)) = .01 // Rotation speed and direction.
_CloudCubemapNormalLitColor("Cloud Cubemap Normal Lit Color", Color) = (1, 1, 1, 1) // Lit color.
_CloudCubemapNormalShadowColor("Cloud Cubemap Normal Shadow Color", Color) = (0, 0, 0, 1) // Shadow color.
_CloudCubemapNormalHeight("Cloud Cubemap Normal Height", Range(-1, 1)) = 0 // Cloud height
_CloudCubemapNormalToLight("Cloud Cubemap Light Direction", Vector) = (0, 1, 0, 0) // Direction to light.
[NoScaleOffset]_CloudCubemapNormalDoubleTexture("Cloud Cubemap Normal Double Cubemap", CUBE) = "clear" {} // Cloud custom texture.
_CloudCubemapNormalDoubleLayerHeight("Cloud Cubemap Normal Double Layer Offset", float) = 0 // Offset of the duplicate cloud layer.
_CloudCubemapNormalDoubleLayerRotationSpeed("Cloud Cubemap Normal Double Layer Rotation Speed", Range(-1, 1)) = .02
_CloudCubemapNormalDoubleLitColor("Cloud Cubemap Normal Double Lit Color", Color) = (1, 1, 1, 1) // Double layer lit color.
_CloudCubemapNormalDoubleShadowColor("Cloud Cubemap Normal Double Shadow Color", Color) = (0, 0, 0, 1) // Double layer shadow color.
_HorizonFogColor("Fog Color", Color) = (1, 1, 1, 1) // Fog color.
_HorizonFogDensity("Fog Density", Range(0, 1)) = .12 // Density and visibility of the fog.
_HorizonFogLength("Fog Height", Range(.03, 1)) = .1 // Height the fog reaches up into the skybox.
_DebugPointsCount("Debug Points Count", Range(0, 100)) = 0 // Used for visualizing orbit paths in editor only.
_DebugPointRadius("Debug Point Radius", Range(0, .1)) = .03 // Size of sphere point dots when visualized.
}
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Background" "IgnoreProjector"="true" "PreviewType" = "Skybox" }
LOD 100
ZWrite Off
Cull Off
Pass {
CGPROGRAM
#pragma target 2.0
#pragma multi_compile_fog
#pragma shader_feature_local GRADIENT_BACKGROUND
#pragma shader_feature_local VERTEX_GRADIENT_BACKGROUND
#pragma shader_feature_local STARS_BASIC
#pragma shader_feature_local STAR_LAYER_1
#pragma shader_feature_local STAR_LAYER_2
#pragma shader_feature_local STAR_LAYER_3
#pragma shader_feature_local STAR_LAYER_1_CUSTOM_TEXTURE
#pragma shader_feature_local STAR_LAYER_2_CUSTOM_TEXTURE
#pragma shader_feature_local STAR_LAYER_3_CUSTOM_TEXTURE
#pragma shader_feature_local STAR_LAYER_1_SPRITE_SHEET
#pragma shader_feature_local STAR_LAYER_2_SPRITE_SHEET
#pragma shader_feature_local STAR_LAYER_3_SPRITE_SHEET
#pragma shader_feature_local MOON
#pragma shader_feature_local MOON_CUSTOM_TEXTURE
#pragma shader_feature_local MOON_SPRITE_SHEET
#pragma shader_feature_local SUN
#pragma shader_feature_local SUN_CUSTOM_TEXTURE
#pragma shader_feature_local SUN_SPRITE_SHEET
#pragma shader_feature_local HORIZON_FOG
#pragma shader_feature_local CLOUDS
#pragma shader_feature_local NOISE_CLOUDS
#pragma shader_feature_local CUBEMAP_CLOUDS
#pragma shader_feature_local CUBEMAP_NORMAL_CLOUDS
#pragma shader_feature_local CUBEMAP_CLOUD_DOUBLE_LAYER
#pragma shader_feature_local CUBEMAP_NORMAL_CLOUD_DOUBLE_LAYER
#pragma shader_feature_local CUBEMAP_CLOUD_FORMAT_RGB
#pragma shader_feature_local CUBEMAP_CLOUD_FORMAT_RGBA
#pragma shader_feature_local CUBEMAP_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
#pragma shader_feature_local CUBEMAP_NORMAL_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
#pragma shader_feature_local SUN_ALPHA_BLEND
#pragma shader_feature_local MOON_ALPHA_BLEND
#pragma shader_feature_local MOON_ROTATION
#pragma shader_feature_local RENDER_DEBUG_POINTS
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Utility/SkyMathUtilities.cginc"
#if defined(STAR_LAYER_1) || defined(STAR_LAYER_2) || defined(STAR_LAYER_3)
#define STARS_ADVANCED 1
#endif
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 vertex : SV_POSITION;
float3 smoothVertex : TEXCOORD1;
#if CLOUDS && NOISE_CLOUDS
float4 cloudUVs : TEXCOORD2;
#endif
#if GRADIENT_BACKGROUND && VERTEX_GRADIENT_BACKGROUND
fixed4 backgroundColor : TEXCOORD3;
#endif
#if SUN
float3 sunLocalPosition : TEXCOORD4;
#endif
#if MOON
float3 moonLocalPosition : TEXCOORD5;
#endif
#if STARS_ADVANCED
float2 starDataTexUV : TEXCOORD6;
#endif
};
// Cubemap.
samplerCUBE _MainTex;
// Gradient sky.
float _UseGradientSky;
fixed4 _GradientSkyUpperColor;
fixed4 _GradientSkyMiddleColor;
fixed4 _GradientSkyLowerColor;
float _GradientFadeMiddlePosition;
float _GradientFadeBegin;
float _GradientFadeEnd;
float _StarFadeBegin;
float _StarFadeEnd;
#if STARS_BASIC
samplerCUBE _StarBasicCubemap;
float _StarBasicTwinkleAmount;
float _StarBasicTwinkleSpeed;
float _StarBasicOpacity;
fixed4 _StarBasicTintColor;
float _StarBasicHDRBoost;
float _StarBasicExponent;
#endif
#ifdef STAR_LAYER_1
// Star Layer 1
fixed4 _StarLayer1Color;
float _StarLayer1MaxRadius;
float _StarLayer1Density;
float _StarLayer1TwinkleAmount;
float _StarLayer1TwinkleSpeed;
float _StarLayer1RotationSpeed;
float _StarLayer1EdgeFade;
sampler2D _StarLayer1DataTex;
float4 _StarLayer1DataTex_ST;;
fixed _StarLayer1HDRBoost;
#ifdef STAR_LAYER_1_CUSTOM_TEXTURE
sampler2D _StarLayer1Tex;
#ifdef STAR_LAYER_1_SPRITE_SHEET
float2 _StarLayer1SpriteDimensions;
int _StarLayer1SpriteItemCount;
int _StarLayer1SpriteAnimationSpeed;
#endif
#endif
#endif
#ifdef STAR_LAYER_2
// Star Layer 2
fixed4 _StarLayer2Color;
float _StarLayer2MaxRadius;
float _StarLayer2Density;
float _StarLayer2TwinkleAmount;
float _StarLayer2TwinkleSpeed;
float _StarLayer2RotationSpeed;
float _StarLayer2EdgeFade;
sampler2D _StarLayer2DataTex;
float4 _StarLayer2DataTex_ST;;
fixed _StarLayer2HDRBoost;
#ifdef STAR_LAYER_2_CUSTOM_TEXTURE
sampler2D _StarLayer2Tex;
#ifdef STAR_LAYER_2_SPRITE_SHEET
float2 _StarLayer2SpriteDimensions;
int _StarLayer2SpriteItemCount;
int _StarLayer2SpriteAnimationSpeed;
#endif
#endif
#endif
#ifdef STAR_LAYER_3
// Star Layer 3
fixed4 _StarLayer3Color;
float _StarLayer3MaxRadius;
float _StarLayer3Density;
float _StarLayer3TwinkleAmount;
float _StarLayer3TwinkleSpeed;
float _StarLayer3RotationSpeed;
float _StarLayer3EdgeFade;
sampler2D _StarLayer3DataTex;
float4 _StarLayer3DataTex_ST;;
fixed _StarLayer3HDRBoost;
#ifdef STAR_LAYER_3_CUSTOM_TEXTURE
sampler2D _StarLayer3Tex;
#ifdef STAR_LAYER_3_SPRITE_SHEET
float2 _StarLayer3SpriteDimensions;
int _StarLayer3SpriteItemCount;
int _StarLayer3SpriteAnimationSpeed;
#endif
#endif
#endif
float _HorizonScaleFactor;
#ifdef MOON
// Moon
float4x4 _MoonWorldToLocalMat;
#ifdef MOON_CUSTOM_TEXTURE
sampler2D _MoonTex;
#ifdef MOON_SPRITE_SHEET
float2 _MoonSpriteDimensions;
int _MoonSpriteItemCount;
int _MoonSpriteAnimationSpeed;
#endif
#endif
fixed4 _MoonColor;
float _MoonRadius;
float _MoonEdgeFade;
fixed _MoonHDRBoost;
float4 _MoonPosition;
fixed _MoonAlpha;
#endif
#ifdef SUN
// Sun
float4x4 _SunWorldToLocalMat;
#ifdef SUN_CUSTOM_TEXTURE
sampler2D _SunTex;
#ifdef SUN_SPRITE_SHEET
float2 _SunSpriteDimensions;
int _SunSpriteItemCount;
int _SunSpriteAnimationSpeed;
#endif
#endif
fixed4 _SunColor;
float _SunRadius;
float _SunEdgeFade;
fixed _SunHDRBoost;
float4 _SunPosition;
fixed _SunAlpha;
#endif
#ifdef CLOUDS
// Generic cloud uniforms.
float _CloudAlpha;
#if NOISE_CLOUDS
sampler2D _CloudNoiseTexture;
float _CloudHeight;
float _CloudSpeed;
float _CloudDensity;
float _CloudDirection;
float _CloudFadePosition;
float _CloudFadeAmount;
float _CloudTextureTiling;
fixed4 _CloudColor1;
fixed4 _CloudColor2;
#endif
#if CUBEMAP_CLOUDS
samplerCUBE _CloudCubemapTexture;
float _CloudCubemapRotationSpeed;
fixed4 _CloudCubemapTintColor;
float _CloudCubemapHeight;
#if CUBEMAP_CLOUD_DOUBLE_LAYER
float _CloudCubemapDoubleLayerHeight;
float _CloudCubemapDoubleLayerRotationSpeed;
fixed4 _CloudCubemapDoubleLayerTintColor;
#if CUBEMAP_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
samplerCUBE _CloudCubemapDoubleTexture;
#endif
#endif // CUBEMAP_CLOUD_DOUBLE_LAYER
#endif
#if CUBEMAP_NORMAL_CLOUDS
samplerCUBE _CloudCubemapNormalTexture;
float _CloudCubemapNormalAmbientIntensity;
float _CloudCubemapNormalRotationSpeed;
float _CloudCubemapNormalHeight;
fixed4 _CloudCubemapNormalLitColor;
fixed4 _CloudCubemapNormalShadowColor;
float3 _CloudCubemapNormalToLight;
#if CUBEMAP_NORMAL_CLOUD_DOUBLE_LAYER
float _CloudCubemapNormalDoubleLayerHeight;
float _CloudCubemapNormalDoubleLayerRotationSpeed;
fixed4 _CloudCubemapNormalDoubleLitColor;
fixed4 _CloudCubemapNormalDoubleShadowColor;
#if CUBEMAP_NORMAL_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
samplerCUBE _CloudCubemapNormalDoubleTexture;
#endif
#endif // CUBEMAP_NORMAL_CLOUD_DOUBLE_LAYER
#endif
#endif
#if HORIZON_FOG
fixed4 _HorizonFogColor;
float _HorizonFogDensity;
float _HorizonFogLength;
#endif
#if RENDER_DEBUG_POINTS
// This is only used in the editor for debugging and will get compiled out.
float4 _DebugPoints[100];
int _DebugPointsCount;
float _DebugPointRadius;
#endif
#define _MAX_CLOUD_COVERAGE 7
#define _CLOUD_HEIGHT_LIMITS float2(30, 100)
fixed4 AlphaBlendPartial(fixed4 top, fixed4 bottom) {
fixed outAlpha = max(top.a, 0.001f) + bottom.a * (1.0f - top.a);
fixed3 outColor = (top.rgb * top.a + bottom.rgb * bottom.a * (1.0f - top.a)) / outAlpha;
return fixed4(outColor, outAlpha);
}
// Does an over alpha blend, assumes bottom color is opaque.
fixed4 AlphaBlend(fixed4 top, fixed4 bottom) {
fixed3 ca = top.xyz;
fixed aa = top.w;
fixed3 cb = bottom.xyz;
fixed ab = bottom.w;
fixed3 color = (ca * aa + cb * ab * (1 - aa)) / (aa + ab * (1 - aa));
return fixed4(color, 1.0f);
}
float2 CalculateStarRotation(float3 star)
{
float3 starPos = float3(star.x, star.y, star.z);
float yRotationAngle = AngleToReachTarget(starPos.xz, UNITY_HALF_PI);
starPos = RotateAroundYAxis(starPos, yRotationAngle);
float xRotationAngle = AngleToReachTarget(starPos.zy, 0.0f);
return float2(xRotationAngle, yRotationAngle);
}
float2 GetUVsForSpherePoint(float3 fragPos, float radius, float3 targetPoint) {
float2 bodyRotations = CalculateStarRotation(targetPoint);
float3 projectedPosition = RotatePoint(fragPos, bodyRotations.x, bodyRotations.y);
// Find our UV position.
return clamp(float2(
(projectedPosition.x + radius) / (2.0 * radius),
(projectedPosition.y + radius) / (2.0 * radius)), 0, 1);
}
float4 GetDataFromTexture(sampler2D tex, float2 uv) {
float4 col = tex2Dlod(tex, float4(uv.x, uv.y, 0.0f, 0.0f));
#if defined(UNITY_COLORSPACE_GAMMA) == false
col.xyz = LinearToGammaSpace(col.xyz);
#endif
return col;
}
inline float4 GetStarDataFromTexture(sampler2D nearbyStarTexture, float2 uv) {
float4 percentData = GetDataFromTexture(nearbyStarTexture, uv);
float2 sphericalCoord = ConvertPercentToSphericalCoordinate(percentData.xy);
return float4(sphericalCoord.x, sphericalCoord.y, percentData.z, 1.0f);
}
float2 AnimateStarRotation(float2 starUV, float rotationSpeed, float scale, float2 pivot) {
return Rotate2d(starUV - pivot, rotationSpeed * _Time.y * scale) + pivot;
}
float GetStarRadius(float noise, float maxRadius, float twinkleAmount) {
float noisePercent = noise;
float minRadius = clamp((1 - twinkleAmount) * maxRadius, 0, maxRadius);
return clamp(maxRadius * noise, minRadius, maxRadius) * _HorizonScaleFactor;
}
uint GetSpriteTargetIndex(int itemCount, int animationSpeed, float seed) {
float delta = _Time.y + (10.0f * seed);
float timePerFrame = 1.0f / (float)animationSpeed;
int frameIndex = (int)(delta / timePerFrame);
return (uint)abs(frameIndex % itemCount);
}
float2 GetSpriteItemSize(float2 dimensions) {
return float2(1.0f / dimensions.x, (1.0f / dimensions.x) * (dimensions.x / dimensions.y));
}
float2 GetSpriteRotationOrigin(uint targetFrameIndex, float2 dimensions, float2 itemSize) {
uint rows = (uint)dimensions.y;
uint columns = (uint)dimensions.x;
return float2(((float)(targetFrameIndex % columns) * itemSize.x + (itemSize.x / 2.0f)),
(float)((rows - 1) - (targetFrameIndex / columns)) * itemSize.y + (itemSize.y / 2.0f));
}
float2 GetSpriteSheetCoords(float2 uv, float2 dimensions, uint targetFrameIndex, float2 itemSize, uint numItems) {
uint rows = (uint)dimensions.y;
uint columns = (uint)dimensions.x;
float2 scaledUV = float2(uv.x * itemSize.x, uv.y * itemSize.y);
float2 offset = float2(
targetFrameIndex % columns * itemSize.x,
((rows - 1) - (targetFrameIndex / columns)) * itemSize.y);
return scaledUV + offset;
}
float2 ConvertLocalPointToUV(float2 localPoint, float radius) {
float2 shiftedPoint = localPoint.xy + float2(radius / 2.0f, radius / 2.0f);
return abs(shiftedPoint) / radius;
}
#if STARS_ADVANCED
fixed4 StarColorWithTexture(
float3 pos,
float2 starCoords,
float2 starUV,
sampler2D starTexture,
fixed4 starColorTint,
float starDensity,
float radius,
float twinkleAmount,
float twinkleSpeed,
float rotationSpeed,
float edgeFade,
sampler2D nearbyStarsTexture,
float4 gridPointWithNoise) {
float3 gridPoint = gridPointWithNoise.xyz;
float distanceToCenter = distance(pos, gridPoint);
fixed4 outputColor = tex2D(starTexture, starUV) * starColorTint;
// Animate alpha with twinkle wave.
half twinkleWavePercent = smoothstep(-1, 1, cos(gridPointWithNoise.w * (100 + _Time.y) * twinkleSpeed));
outputColor *= clamp(twinkleWavePercent, (1 - twinkleAmount), 1);
// If it's outside the radius, zero is multiplied to clear the color values.
return outputColor * smoothstep(radius, radius * (1 - edgeFade), distanceToCenter);
}
fixed4 StarColorNoTexture(
float3 pos,
fixed4 starColorTint,
float starDensity,
float radius,
float twinkleAmount,
float twinkleSpeed,
float edgeFade,
sampler2D nearbyStarsTexture,
float4 gridPointWithNoise) {
float3 gridPoint = gridPointWithNoise.xyz;
float distanceToCenter = distance(pos, gridPoint);
// Apply a horizon scale so stars are less visible with distance.
radius *= _HorizonScaleFactor;
fixed4 outputColor = starColorTint;
// Animate alpha with twinkle wave.
half twinkleWavePercent = smoothstep(-1, 1, cos(gridPointWithNoise.w * (100 + _Time.y) * twinkleSpeed));
outputColor *= clamp(twinkleWavePercent, (1 - twinkleAmount), 1);
// If it's outside the radius, zero is multiplied to clear the color values.
return outputColor * smoothstep(radius, radius * (1 - edgeFade), distanceToCenter);
}
fixed4 StarColorFromAllGrids(float3 pos, float2 starTextureUV) {
float4 nearbyStar = float4(0, 0, 0, 0);
fixed4 allStarColors = fixed4(0, 0, 0, 0);
float4 nearbySphericalStar = float4(0, 0, 0, 0);
float3 nearbyStarDirection = float3(0, 0, 0);
#ifdef STAR_LAYER_3
nearbySphericalStar = GetStarDataFromTexture(_StarLayer3DataTex, starTextureUV);
nearbyStarDirection = SphericalCoordinateToDirection(nearbySphericalStar.xy);
nearbyStar = float4(nearbyStarDirection.x, nearbyStarDirection.y, nearbyStarDirection.z, nearbySphericalStar.z);
if (distance(pos, nearbyStar) <= _StarLayer3MaxRadius) {
float radius = GetStarRadius(nearbyStar.w, _StarLayer3MaxRadius, _StarLayer3TwinkleAmount);
#ifdef STAR_LAYER_3_CUSTOM_TEXTURE
float2 texUV = GetUVsForSpherePoint(pos, radius, nearbyStar.xyz);
float2 pivot = float2(.5f, .5f);
#if STAR_LAYER_3_SPRITE_SHEET
uint spriteFrameIndex = GetSpriteTargetIndex(_StarLayer3SpriteItemCount, _StarLayer3SpriteAnimationSpeed, nearbyStar.w);
float2 spriteItemSize = GetSpriteItemSize(_StarLayer3SpriteDimensions);
texUV = GetSpriteSheetCoords(texUV, _StarLayer3SpriteDimensions, spriteFrameIndex, spriteItemSize, _StarLayer3SpriteItemCount);
pivot = GetSpriteRotationOrigin(spriteFrameIndex, _StarLayer3SpriteDimensions, spriteItemSize);
#endif
texUV = AnimateStarRotation(texUV, _StarLayer3RotationSpeed * nearbyStar.w, 1, pivot);
allStarColors += StarColorWithTexture(
pos,
starTextureUV,
texUV,
_StarLayer3Tex,
_StarLayer3Color,
_StarLayer3Density,
radius,
_StarLayer3TwinkleAmount,
_StarLayer3TwinkleSpeed,
_StarLayer3RotationSpeed,
_StarLayer3EdgeFade,
_StarLayer3DataTex,
nearbyStar) * _StarLayer3HDRBoost;
#else
allStarColors += StarColorNoTexture(
pos,
_StarLayer3Color,
_StarLayer3Density,
radius,
_StarLayer3TwinkleAmount,
_StarLayer3TwinkleSpeed,
_StarLayer3EdgeFade,
_StarLayer3DataTex,
nearbyStar) * _StarLayer3HDRBoost;
#endif
}
#endif
#ifdef STAR_LAYER_2
nearbySphericalStar = GetStarDataFromTexture(_StarLayer2DataTex, starTextureUV);
nearbyStarDirection = SphericalCoordinateToDirection(nearbySphericalStar.xy);
nearbyStar = float4(nearbyStarDirection.x, nearbyStarDirection.y, nearbyStarDirection.z, nearbySphericalStar.z);
if (distance(pos, nearbyStar) <= _StarLayer2MaxRadius) {
float radius = GetStarRadius(nearbyStar.w, _StarLayer2MaxRadius, _StarLayer2TwinkleAmount);
#ifdef STAR_LAYER_2_CUSTOM_TEXTURE
float2 texUV = GetUVsForSpherePoint(pos, radius, nearbyStar.xyz);
float2 pivot = float2(.5f, .5f);
#if STAR_LAYER_2_SPRITE_SHEET
uint spriteFrameIndex = GetSpriteTargetIndex(_StarLayer2SpriteItemCount, _StarLayer2SpriteAnimationSpeed, nearbyStar.w);
float2 spriteItemSize = GetSpriteItemSize(_StarLayer2SpriteDimensions);
texUV = GetSpriteSheetCoords(texUV, _StarLayer2SpriteDimensions, spriteFrameIndex, spriteItemSize, _StarLayer2SpriteItemCount);
pivot = GetSpriteRotationOrigin(spriteFrameIndex, _StarLayer2SpriteDimensions, spriteItemSize);
#endif
texUV = AnimateStarRotation(texUV, _StarLayer2RotationSpeed * nearbyStar.w, 1, pivot);
allStarColors += StarColorWithTexture(
pos,
starTextureUV,
texUV,
_StarLayer2Tex,
_StarLayer2Color,
_StarLayer2Density,
radius,
_StarLayer2TwinkleAmount,
_StarLayer2TwinkleSpeed,
_StarLayer2RotationSpeed,
_StarLayer2EdgeFade,
_StarLayer2DataTex,
nearbyStar) * _StarLayer2HDRBoost;
#else
allStarColors += StarColorNoTexture(
pos,
_StarLayer2Color,
_StarLayer2Density,
radius,
_StarLayer2TwinkleAmount,
_StarLayer2TwinkleSpeed,
_StarLayer2EdgeFade,
_StarLayer2DataTex,
nearbyStar) * _StarLayer2HDRBoost;
#endif
}
#endif
#ifdef STAR_LAYER_1
nearbySphericalStar = GetStarDataFromTexture(_StarLayer1DataTex, starTextureUV);
nearbyStarDirection = SphericalCoordinateToDirection(nearbySphericalStar.xy);
nearbyStar = float4(nearbyStarDirection.x, nearbyStarDirection.y, nearbyStarDirection.z, nearbySphericalStar.z);
if (distance(pos, nearbyStar) <= _StarLayer1MaxRadius) {
float radius = GetStarRadius(nearbyStar.w, _StarLayer1MaxRadius, _StarLayer1TwinkleAmount);
#ifdef STAR_LAYER_1_CUSTOM_TEXTURE
float2 texUV = GetUVsForSpherePoint(pos, radius, nearbyStar.xyz);
float2 pivot = float2(.5f, .5f);
#if STAR_LAYER_1_SPRITE_SHEET
uint spriteFrameIndex = GetSpriteTargetIndex(_StarLayer1SpriteItemCount, _StarLayer1SpriteAnimationSpeed, nearbyStar.w);
float2 spriteItemSize = GetSpriteItemSize(_StarLayer1SpriteDimensions);
texUV = GetSpriteSheetCoords(texUV, _StarLayer1SpriteDimensions, spriteFrameIndex, spriteItemSize, _StarLayer1SpriteItemCount);
pivot = GetSpriteRotationOrigin(spriteFrameIndex, _StarLayer1SpriteDimensions, spriteItemSize);
#endif
texUV = AnimateStarRotation(texUV, _StarLayer1RotationSpeed * nearbyStar.w, 1, pivot);
allStarColors += StarColorWithTexture(
pos,
starTextureUV,
texUV,
_StarLayer1Tex,
_StarLayer1Color,
_StarLayer1Density,
radius,
_StarLayer1TwinkleAmount,
_StarLayer1TwinkleSpeed,
_StarLayer1RotationSpeed,
_StarLayer1EdgeFade,
_StarLayer1DataTex,
nearbyStar) * _StarLayer1HDRBoost;
#else
allStarColors += StarColorNoTexture(
pos,
_StarLayer1Color,
_StarLayer1Density,
radius,
_StarLayer1TwinkleAmount,
_StarLayer1TwinkleSpeed,
_StarLayer1EdgeFade,
_StarLayer1DataTex,
nearbyStar) * _StarLayer1HDRBoost;
#endif
}
#endif
return allStarColors;
}
#endif // STARS_ADVANCED
fixed4 FadeStarsColor(float verticalPosition, fixed4 starColor) {
float fadeAmount = smoothstep(_StarFadeBegin, _StarFadeEnd, verticalPosition);
return fixed4(starColor.xyz * fadeAmount, 1.0f);
}
#if STARS_BASIC
fixed4 BasicStarColorAtFragment(float3 pos) {
fixed3 starData = texCUBE(_StarBasicCubemap, pos);
float twinklePercent = sin(_Time.y * _StarBasicTwinkleSpeed + (starData.b * 3.0f) ) * .5f + .5f;
float twinkleValue = lerp(1.0f - _StarBasicTwinkleAmount, _StarBasicHDRBoost, twinklePercent);
fixed starIntensity = pow(starData.g + starData.r, _StarBasicExponent) * twinkleValue * _StarBasicOpacity;
return _StarBasicTintColor * starIntensity;
}
#endif
fixed4 Calculate3WayGradientBackgroundAtPosition(float3 pos) {
float2 sphereFragCoord = DirectionToSphericalCoordinate(pos);
float verticalPosition = pos.y;
// 3 way gradient.
float middleGradientPosition = _GradientFadeBegin
+ ((_GradientFadeEnd - _GradientFadeBegin) * _GradientFadeMiddlePosition);
fixed4 lowerColor = _GradientSkyLowerColor;
fixed4 middleColor = _GradientSkyMiddleColor;
fixed4 upperColor = _GradientSkyUpperColor;
float bottomColorPercent = smoothstep(_GradientFadeBegin, middleGradientPosition, verticalPosition);
fixed4 bottomMixedColor = lerp(lowerColor, middleColor, bottomColorPercent);
bottomMixedColor *= !step(middleGradientPosition, verticalPosition);
float topColorPercent = smoothstep(middleGradientPosition, _GradientFadeEnd, verticalPosition);
fixed4 topMixedColor = lerp(middleColor, upperColor, topColorPercent);
topMixedColor *= step(middleGradientPosition, verticalPosition);
return bottomMixedColor + topMixedColor;
}
v2f vert(appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
float3 normalizedVertex = normalize(v.vertex.xyz);
float3 worldVertexPosition = mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1.0f));
o.smoothVertex = v.vertex;
#ifdef CLOUDS
#if NOISE_CLOUDS
float3 cloudWorldVertex = normalize(mul((float3x3)unity_ObjectToWorld, v.vertex.xyz));
float computedHeight = lerp(_CLOUD_HEIGHT_LIMITS.x, _CLOUD_HEIGHT_LIMITS.y, 1 - _CloudHeight);
cloudWorldVertex.y *= computedHeight * .2f;
float cloudSpeed = _CloudSpeed * _Time;
cloudWorldVertex.xz = Rotate2d(cloudWorldVertex.xz, _CloudDirection);
cloudWorldVertex = normalize(cloudWorldVertex);
o.cloudUVs.xy = (cloudWorldVertex.xz * _CloudTextureTiling) + float2(cloudSpeed, cloudSpeed);
o.cloudUVs.zw = (cloudWorldVertex.xz * _CloudTextureTiling) + float2(cloudSpeed / 10.0f, cloudSpeed / 11.0f);
#endif
#endif
#if GRADIENT_BACKGROUND && VERTEX_GRADIENT_BACKGROUND
o.backgroundColor = Calculate3WayGradientBackgroundAtPosition(normalizedVertex);
#endif
#if SUN
o.sunLocalPosition = mul(_SunWorldToLocalMat, float4(normalizedVertex, 1.0f));
#endif
#if MOON
o.moonLocalPosition = mul(_MoonWorldToLocalMat, float4(normalizedVertex, 1.0f));
#endif
#if STARS_ADVANCED
o.starDataTexUV = ConvertSphericalCoordateToUV(DirectionToSphericalCoordinate(normalizedVertex));
#endif
return o;
}
fixed4 OrbitBodyColorWithTextureUV(float3 pos, float3 orbitBodyPosition,
fixed4 orbitBodyTintColor, float orbitBodyRadius, float orbitBodyEdgeFade, sampler2D orbitBodyTex, float2 bodyUVs) {
fixed4 color = tex2D(orbitBodyTex, bodyUVs) * orbitBodyTintColor;
float fragDistance = distance(orbitBodyPosition, pos);
float fadeEnd = orbitBodyRadius * (1 - orbitBodyEdgeFade);
return smoothstep(orbitBodyRadius, fadeEnd, fragDistance) * color;
}
// Alpha premultiplied into color.
fixed4 OrbitBodyColorNoTexture(float3 pos, float3 orbitBodyPosition,
fixed4 orbitBodyColor, float orbitBodyRadius, float orbitBodyEdgeFade) {
float fragDistance = distance(orbitBodyPosition, pos);
float fadeEnd = orbitBodyRadius * (1 - orbitBodyEdgeFade);
return orbitBodyColor * smoothstep(orbitBodyRadius, fadeEnd, fragDistance);
}
#ifdef CLOUDS
#if CUBEMAP_NORMAL_CLOUDS
float4 SampleNormalCloudCubemap(float3 vertexPos, float rotationSpeed, float heightOffset, float rotationOffset, float3 shadowColor, float3 litColor) {
float rotationAngle = (_Time.y * rotationSpeed) + rotationOffset;
float3 rotatedDirection = RotateAroundYAxis(vertexPos, -rotationAngle);
rotatedDirection.y += (-1.0f * heightOffset);
float4 cloudColor = texCUBE(_CloudCubemapNormalTexture, rotatedDirection);
float3 cloudFragWorldNormal = cloudColor.xyz * 2.0f - 1.0f;
float3 cloudRotatedWorldNormal = RotateAroundYAxis(cloudFragWorldNormal, rotationAngle);
float3 lightPosition = _CloudCubemapNormalToLight * 10.0f;
float3 toLight = normalize(lightPosition - vertexPos.xyz);
float lightDotProduct = dot(cloudRotatedWorldNormal, toLight);
float lightPercent = (lightDotProduct + 1.0f) / 2.0f;
float3 processedColor = lerp(shadowColor, litColor, saturate(_CloudCubemapNormalAmbientIntensity + lightPercent));
return float4(processedColor, cloudColor.w);
}
// Clouds coming from a cubemap with normals.
half4 RenderCubemapNormalClouds(float3 vertexPos, float4 backgroundColor)
{
float4 cloudColor = SampleNormalCloudCubemap(vertexPos, _CloudCubemapNormalRotationSpeed, _CloudCubemapNormalHeight, 0,
_CloudCubemapNormalShadowColor, _CloudCubemapNormalLitColor);
#if CUBEMAP_NORMAL_CLOUD_DOUBLE_LAYER
float4 cloudColor2 = SampleNormalCloudCubemap(vertexPos, _CloudCubemapNormalDoubleLayerRotationSpeed,
_CloudCubemapNormalDoubleLayerHeight, UNITY_HALF_PI, _CloudCubemapNormalDoubleShadowColor, _CloudCubemapNormalDoubleLitColor);
float origAlpha = max(cloudColor.w, cloudColor2.w);
cloudColor = saturate(AlphaBlend(cloudColor, cloudColor2));
cloudColor.w = origAlpha;
#endif
cloudColor.a = cloudColor.a * _CloudAlpha;
return AlphaBlend(cloudColor, backgroundColor);
}
#endif
#if CUBEMAP_CLOUDS
fixed4 SampleCloudCubemap(float3 vertexPos, float rotationSpeed, float heightOffset, float rotationOffset, samplerCUBE tex, float4 tintColor) {
float rotationAngle = (_Time.y * rotationSpeed) + rotationOffset;
float3 rotatedDirection = RotateAroundYAxis(vertexPos, -rotationAngle);
rotatedDirection.y += (-1.0f * heightOffset);
fixed4 outColor = texCUBE(tex, rotatedDirection) * tintColor;
outColor.a = pow(outColor.a, 2);
return outColor;
}
// Clouds coming from a cubemap, no normals, unlit
fixed4 RenderCubemapClouds(float3 vertexPos, fixed4 backgroundColor) {
float rotationAngle = _Time.y * _CloudCubemapRotationSpeed;
float3 rotatedDirection = RotateAroundYAxis(vertexPos, -rotationAngle);
rotatedDirection.y += (-1.0f * _CloudCubemapHeight);
fixed4 cloudColor = SampleCloudCubemap(vertexPos, _CloudCubemapRotationSpeed, _CloudCubemapHeight,
0, _CloudCubemapTexture, _CloudCubemapTintColor);
#if CUBEMAP_CLOUD_FORMAT_RGB
// Premultiply alpha before additive blending for opacity control.
cloudColor.xyz *= cloudColor.a;
#if CUBEMAP_CLOUD_DOUBLE_LAYER
#if CUBEMAP_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
fixed4 cloudColor2 = SampleCloudCubemap(vertexPos, _CloudCubemapDoubleLayerRotationSpeed, _CloudCubemapDoubleLayerHeight,
UNITY_HALF_PI, _CloudCubemapDoubleTexture, _CloudCubemapDoubleLayerTintColor);
#else // Else no custom texture.
fixed4 cloudColor2 = SampleCloudCubemap(vertexPos, _CloudCubemapDoubleLayerRotationSpeed, _CloudCubemapDoubleLayerHeight,
UNITY_HALF_PI, _CloudCubemapTexture, _CloudCubemapDoubleLayerTintColor);
#endif // CUBEMAP_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
// Premultiply alpha before additive blending for opacity control.
cloudColor2.xyz *= cloudColor2.a;
return fixed4(((cloudColor.xyz + cloudColor2.xyz) * _CloudAlpha) + backgroundColor.xyz, 1.0f);
#else // Else, no double layer.
return fixed4((cloudColor.xyz * _CloudAlpha) + backgroundColor.xyz, 1.0f);
#endif // CUBEMAP_CLOUD_DOUBLE_LAYER
#else // CUBEMAP RGBA
#if CUBEMAP_CLOUD_DOUBLE_LAYER
#if CUBEMAP_CLOUD_DOUBLE_LAYER_CUSTOM_TEXTURE
fixed4 cloudColor2 = SampleCloudCubemap(vertexPos, _CloudCubemapDoubleLayerRotationSpeed, _CloudCubemapDoubleLayerHeight,
UNITY_HALF_PI, _CloudCubemapDoubleTexture, _CloudCubemapDoubleLayerTintColor);
#else
fixed4 cloudColor2 = SampleCloudCubemap(vertexPos, _CloudCubemapDoubleLayerRotationSpeed, _CloudCubemapDoubleLayerHeight,
UNITY_HALF_PI, _CloudCubemapTexture, _CloudCubemapDoubleLayerTintColor);
#endif
cloudColor = AlphaBlendPartial(cloudColor, cloudColor2);
#endif // CUBEMAP_CLOUD_DOUBLE_LAYER
backgroundColor.a = 1.0f;
cloudColor.a = cloudColor.a * _CloudAlpha;
return AlphaBlend(cloudColor, backgroundColor);
#endif
}
#endif
#if NOISE_CLOUDS
half4 RenderNoiseClouds(float4 cloudUVs, float3 vertexPos, float4 backgroundColor) {
// Cloud noise.
float4 tex1 = GetDataFromTexture(_CloudNoiseTexture, cloudUVs.xy);
float4 tex2 = GetDataFromTexture(_CloudNoiseTexture, cloudUVs.zw);
float noise1 = pow(tex1.g + tex2.g, 0.25f);
float noise2 = pow(tex2.b * tex1.r, 0.5f);
// Percent in the fadeout (0 means no fadeout, 1 means full fadeout - no clouds)
float fadeOutPercent = smoothstep(_CloudFadePosition, 1, length(vertexPos.xz));
_CloudColor1.rgb = pow(_CloudColor1.rgb, 2.2f);
_CloudColor2.rgb = pow(_CloudColor2.rgb, 2.2f);
float3 cloud1 = lerp(float3(0, 0, 0), _CloudColor2.rgb, noise1);
float3 cloud2 = lerp(float3(0, 0, 0), _CloudColor1.rgb, noise2) * 1.5f;
float3 cloud = lerp(cloud1, cloud2, noise1 * noise2);
// Cloud alpha.
float outColorAlpha = 1.0f;
float expandedDensity = _MAX_CLOUD_COVERAGE * (1.0f - _CloudDensity);
float cloudAlpha = saturate(pow(noise1 * noise2, expandedDensity)) * pow(outColorAlpha, 0.35f);
cloudAlpha *= 1.0f - fadeOutPercent * _CloudFadeAmount;
cloudAlpha *= step(0.0f, vertexPos.y);
float3 outColor = lerp(backgroundColor.rgb, cloud, cloudAlpha * _CloudAlpha);
return half4(outColor, 1.0f);
}
#endif
#endif // CLOUDS
#ifdef RENDER_DEBUG_POINTS
// Debug points are used for visualized spherical point keyframes in the editor only.
fixed4 RenderDebugPoints(float3 pos) {
fixed4 pointColor = fixed4(1, 0, 0, 1);
fixed4 selectedPointColor = fixed4(0, 1, 0, 1);
for (int i = 0; i < _DebugPointsCount; i++) {
float4 debugPoint = _DebugPoints[i];
float radius = debugPoint.w;
if (distance(debugPoint.xyz, pos) <= _DebugPointRadius) {
half4 color = pointColor;
if (debugPoint.w > 0) {
return selectedPointColor;
} else {
return pointColor;
}
}
}
return fixed4(0, 0, 0, 0);
}
#endif
#ifdef HORIZON_FOG
fixed4 ApplyHorizonFog(fixed4 skyColor, float3 vertexPos) {
float fadePercent = smoothstep(1 - _HorizonFogLength, 1, length(vertexPos.xz));
fadePercent *= _HorizonFogDensity;
return lerp(skyColor, _HorizonFogColor, fadePercent);
}
#endif
fixed4 frag(v2f i) : SV_Target {
#ifdef GRADIENT_BACKGROUND
#if VERTEX_GRADIENT_BACKGROUND
fixed4 background = i.backgroundColor;
#else
fixed4 background = Calculate3WayGradientBackgroundAtPosition(i.smoothVertex);
#endif
#else
fixed4 background = texCUBE(_MainTex, i.smoothVertex);
#endif
float3 normalizedSmoothVertex = normalize(i.smoothVertex);
bool isMoonPixel = 0;
bool isSunPixel = 0;
fixed4 sunColor = fixed4(0, 0, 0, 0);
fixed4 moonColor = fixed4(0, 0, 0, 0);
#ifdef MOON
isMoonPixel = step(distance(normalizedSmoothVertex, _MoonPosition.xyz), _MoonRadius);
float2 moonTexUV = ConvertLocalPointToUV(i.moonLocalPosition.xyz, _MoonRadius * 2.0f);
#if MOON_CUSTOM_TEXTURE
#if MOON_SPRITE_SHEET
uint spriteFrameIndex = GetSpriteTargetIndex(_MoonSpriteItemCount, _MoonSpriteAnimationSpeed, 0.0f);
float2 spriteItemSize = GetSpriteItemSize(_MoonSpriteDimensions.xy);
moonTexUV = GetSpriteSheetCoords(moonTexUV, _MoonSpriteDimensions, spriteFrameIndex, spriteItemSize, _MoonSpriteItemCount);
#endif
moonColor = OrbitBodyColorWithTextureUV(
normalizedSmoothVertex,
_MoonPosition.xyz,
_MoonColor,
_MoonRadius,
_MoonEdgeFade,
_MoonTex,
moonTexUV) * _MoonHDRBoost * isMoonPixel;
#else
moonColor = OrbitBodyColorNoTexture(
normalizedSmoothVertex,
_MoonPosition.xyz,
_MoonColor,
_MoonRadius,
_MoonEdgeFade) * _MoonHDRBoost * isMoonPixel;
#endif
//moonColor.a = _MoonAlpha;
#endif
#ifdef SUN
isSunPixel = step(distance(normalizedSmoothVertex, _SunPosition.xyz), _SunRadius);
float2 sunTexUV = ConvertLocalPointToUV(i.sunLocalPosition.xyz, _SunRadius * 2.0f);
#if SUN_CUSTOM_TEXTURE
#if SUN_SPRITE_SHEET
uint spriteFrameIndex = GetSpriteTargetIndex(_SunSpriteItemCount, _SunSpriteAnimationSpeed, 0.0f);
float2 spriteItemSize = GetSpriteItemSize(_SunSpriteDimensions.xy);
sunTexUV = GetSpriteSheetCoords(sunTexUV, _SunSpriteDimensions, spriteFrameIndex, spriteItemSize, _SunSpriteItemCount);
#endif
sunColor = OrbitBodyColorWithTextureUV(
normalizedSmoothVertex,
_SunPosition.xyz,
_SunColor,
_SunRadius,
_SunEdgeFade,
_SunTex,
sunTexUV) * _SunHDRBoost * isSunPixel;
#else
sunColor = OrbitBodyColorNoTexture(
normalizedSmoothVertex,
_SunPosition.xyz,
_SunColor,
_SunRadius,
_SunEdgeFade) * _SunHDRBoost * isSunPixel;
#endif
//sunColor.a = _SunAlpha;
#endif
#if STARS_BASIC
fixed4 starColor = BasicStarColorAtFragment(normalizedSmoothVertex);
starColor = FadeStarsColor(i.smoothVertex.y, starColor);
// FIXME - Create generic macro for if any star type is active.
#if MOON && !defined(MOON_ALPHA_BLEND)
starColor *= (fixed)!isMoonPixel;
#endif
#if SUN && !defined(SUN_ALPHA_BLEND)
starColor *= (fixed)!isSunPixel;
#endif
background.xyz += starColor.xyz;
#elif STARS_ADVANCED
fixed4 starColor = StarColorFromAllGrids(normalizedSmoothVertex, i.starDataTexUV);
// Fade stars over the horizon.
starColor = FadeStarsColor(i.smoothVertex.y, starColor);
#if MOON && !defined(MOON_ALPHA_BLEND)
starColor *= (fixed)!isMoonPixel;
#endif
#if SUN && !defined(SUN_ALPHA_BLEND)
starColor *= (fixed)!isSunPixel;
#endif
background.xyz += starColor.xyz;
#endif
#ifdef RENDER_DEBUG_POINTS
fixed4 debugPointColor = RenderDebugPoints(normalize(i.smoothVertex.xyz));
bool useDebugColor = step(.1f, length(debugPointColor));
debugPointColor *= useDebugColor;
background *= (fixed)!useDebugColor;
background = background + debugPointColor;
#endif
// Merge the stars over the background color.
fixed4 upperSkyColor = background;
fixed4 finalColor = fixed4(upperSkyColor.xyz, 1);
#if SUN
#ifdef SUN_ALPHA_BLEND
finalColor = AlphaBlend(fixed4(sunColor.xyz, sunColor.w * _SunAlpha), upperSkyColor);
#else
finalColor = upperSkyColor + (sunColor * _SunAlpha);
#endif
#endif
#if MOON
#ifdef MOON_ALPHA_BLEND
finalColor = AlphaBlend(fixed4(moonColor.xyz, moonColor.w * _MoonAlpha), finalColor);
#else
finalColor += moonColor * _MoonAlpha;
#endif
#endif
#ifdef CLOUDS
#if NOISE_CLOUDS
finalColor = RenderNoiseClouds(i.cloudUVs, i.smoothVertex, finalColor);
#elif CUBEMAP_CLOUDS
finalColor = RenderCubemapClouds(i.smoothVertex, finalColor);
#elif CUBEMAP_NORMAL_CLOUDS
finalColor = RenderCubemapNormalClouds(i.smoothVertex, finalColor);
#endif
#endif
#ifdef HORIZON_FOG
finalColor = ApplyHorizonFog(finalColor, i.smoothVertex);
#endif
return finalColor;
}
ENDCG
}
}
CustomEditor "DoNotModifyShaderEditor"
Fallback "Unlit/Color"
}