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
GLSL
1207 lines
50 KiB
GLSL
// 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"
|
|
}
|