NewN_UAVPlane/Assets/3rdParty/TENKOKU - DYNAMIC SKY/SHADERS/Tenkoku_aurora_sphere.shader

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
}
}
}