187 lines
4.5 KiB
Plaintext
187 lines
4.5 KiB
Plaintext
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
|
|
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
|
|
|
Shader "TENKOKU/aurora_sphere"
|
|
{
|
|
Properties
|
|
{
|
|
|
|
_AuroraTex("Aurora Texture", 2D) = ""{}
|
|
_AuroraTexNormal("Aurora Normal Texture", 2D) = ""{}
|
|
|
|
[Space]
|
|
_Altitude4("Altitude 4 (bottom)", Float) = 5500
|
|
_Altitude5("Altitude 5 (top)", Float) = 6000
|
|
_FarDist("Far Distance", Float) = 30000
|
|
|
|
[Space]
|
|
aurSpd ("Aurora Speed", Range(0,1)) = 0.15
|
|
aurScale ("Aurora Scale", Range(0,1)) = 0.394
|
|
aurDefScale ("Aurora Deform Scale", Range(0,4)) = 1.53
|
|
aurNormScale ("Aurora Normal Scale", Range(0,1)) = 0.884
|
|
aurRepeat ("Aurora Repeat", Int) = 32
|
|
aurSep ("Aurora Separation", Float) = 0.02
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SubShader
|
|
{
|
|
|
|
Tags {"Queue"="Background+1600"}
|
|
Cull Front
|
|
Fog {Mode Off}
|
|
Offset 1,80000
|
|
Blend One One
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
#pragma target 3.0
|
|
|
|
|
|
struct appdata_t{
|
|
float4 vertex : POSITION;
|
|
};
|
|
|
|
|
|
struct v2f{
|
|
float4 vertex : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
float3 rayDir : TEXCOORD1;
|
|
float4 projPos : TEXCOORD2;
|
|
};
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "Lighting.cginc"
|
|
|
|
|
|
|
|
v2f vert(appdata_t v){
|
|
float4 p = UnityObjectToClipPos(v.vertex);
|
|
|
|
v2f o;
|
|
|
|
o.vertex = p;
|
|
o.uv = (p.xy / p.w + 1) * 0.5;
|
|
|
|
float3 ray = mul((float3x3)unity_ObjectToWorld, v.vertex.xyz);
|
|
|
|
ray = normalize(ray);
|
|
|
|
o.rayDir = -ray;
|
|
|
|
o.projPos = ComputeScreenPos(p);
|
|
|
|
return o;
|
|
}
|
|
|
|
|
|
|
|
sampler2D _AuroraTex;
|
|
sampler2D _AuroraTexNormal;
|
|
|
|
float _Altitude4;
|
|
float _Altitude5;
|
|
float _FarDist;
|
|
float _cS;
|
|
float _tenkokuTimer;
|
|
float _tenkokuNoiseTimer;
|
|
|
|
float _Tenkoku_AuroraSpd;
|
|
float _Tenkoku_AuroraAmt;
|
|
float aurSpd;
|
|
float aurScale;
|
|
float aurDefScale;
|
|
float aurNormScale;
|
|
int aurRepeat;
|
|
float aurSep;
|
|
|
|
|
|
|
|
|
|
float UVRandom(float2 uv){
|
|
float f = dot(float2(_tenkokuNoiseTimer, _tenkokuNoiseTimer), uv);
|
|
return frac(43758.5453 * sin(f));
|
|
}
|
|
|
|
|
|
|
|
fixed4 frag(v2f i) : SV_Target{
|
|
|
|
float3 acc = float3(0,0,0);
|
|
|
|
|
|
//Set Base Settingd
|
|
float3 ray = -i.rayDir;
|
|
float2 uv = i.uv + _tenkokuTimer;
|
|
half3 wscPos = _WorldSpaceCameraPos;
|
|
wscPos.y = 0;
|
|
half alph;// = depth;
|
|
float3 retCol;// = sky;
|
|
float dist0 = _Altitude4 / ray.y;
|
|
float dist1 = _Altitude5 / ray.y;
|
|
float offs = UVRandom(uv) * (dist1 - dist0) / 50;
|
|
float3 auroraCol = float3(0,0,0);
|
|
float ht;
|
|
float4 uvwAN;
|
|
float3 aN;
|
|
float4 uvwA;
|
|
float4 a1;
|
|
float aurFac;
|
|
aurSpd = aurSpd * _Tenkoku_AuroraSpd;
|
|
|
|
|
|
//Early Return
|
|
if (ray.y < 0.01 || (0 / ray.y) >= _FarDist) return fixed4(0,0,0,0);
|
|
|
|
|
|
//Build Aurora buffer
|
|
for (int ax = 0; ax < aurRepeat; ax++){
|
|
|
|
ht = 2 - (aurSep * ax);
|
|
uvwAN = float4((wscPos + ray * (dist0 + offs)) * 1e-5, -0.1) * _cS * ht;
|
|
uvwAN.y = uvwAN.z;
|
|
uvwAN.xy -= float2(0.0,_Time.x*aurSpd);
|
|
uvwAN.xy *= aurNormScale;
|
|
aN = (tex2Dlod(_AuroraTexNormal, uvwAN).rgb);
|
|
|
|
uvwA = float4((wscPos + ray * (dist0 + offs)) * 1e-5, -0.1) * _cS * ht;
|
|
uvwA.y = uvwA.z;
|
|
uvwA.x += (aurDefScale * aN.x);
|
|
uvwA.xy *= aurScale;
|
|
uvwA.xy += float2(_Time.x*aurSpd*0.1,_Time.x*aurSpd);
|
|
a1 = tex2Dlod(_AuroraTex, uvwA);
|
|
|
|
a1.rgb = lerp(a1.rgb, half3(0,0,0), saturate((1900.0 / ray.y) / _FarDist) );
|
|
|
|
aurFac = ((1.0/aurRepeat)*ax);
|
|
auroraCol.rgb += (a1.rgb * aurFac);
|
|
|
|
}
|
|
//------------------------------
|
|
|
|
float aurAlph = max(max(auroraCol.r, auroraCol.g), auroraCol.b);
|
|
retCol.rgb = (auroraCol) * 2 * _Tenkoku_AuroraAmt;
|
|
alph = 1.0;
|
|
|
|
|
|
|
|
//Final result
|
|
return half4(retCol, alph);
|
|
}
|
|
|
|
|
|
|
|
ENDCG
|
|
}
|
|
|
|
}
|
|
}
|