Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
1,053
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "CloudDomeShader"
  2. {
  3.     Properties
  4.     {
  5.         _cloudscale ("Cloud Scale", float) = 0.05
  6.         _speedroll ("Speed Roll", float) = 0.0025
  7.         _speedwind ("Speed Wind", float) = 0.01
  8.         _clouddark ("Cloud Dark", float) = 0.5
  9.         _cloudlight ("Cloud Light", float) = 0.3
  10.         _skycolor ("Sky Color", Color) = (0.3, 0.5, 0.7, 1.0)
  11.         _count ("Noise Iterations", Int) = 6
  12.     }
  13.     Subshader
  14.     {
  15.         Cull Front
  16.         ZWrite On
  17.         Lighting Off
  18.         SeparateSpecular Off
  19.         Fog { Mode Off }
  20.         Pass
  21.         {
  22.             CGPROGRAM
  23.             #pragma vertex vertex_shader
  24.             #pragma fragment pixel_shader
  25.             #pragma target 5.0
  26.             #pragma fragmentoption ARB_precision_hint_fastest
  27.  
  28.             #define iTime _Time.g
  29.            
  30.             float _cloudscale;
  31.             float _speedroll;
  32.             float _speedwind;
  33.             float _clouddark;
  34.             float _cloudlight;
  35.             float4 _skycolor;
  36.             int _count;
  37.  
  38.             #define m float2x2( 1.6,  1.2, -1.2,  1.6 )
  39.  
  40.             float2 hash( float2 p ) {
  41.                 p = float2(dot(p,float2(127.1,311.7)), dot(p,float2(269.5,183.3)));
  42.                 return frac(sin(p)*43758.5453123) - .5;
  43.                 // another ver. (see the comment in 'noise' func):
  44.                 //p  = frac(p * float2(0.3247122237916646, 0.134707348285849));
  45.                 //p += dot(p.xy, p.yx+19.19);
  46.                 //return frac(p)-.5;
  47.             }
  48.  
  49.             float skyNoise( in float2 p ) {
  50.                 const float K1 = 0.366025404;
  51.                 const float K2 = 0.211324865;
  52.                 float2 i = floor(p + (p.x+p.y)*K1);
  53.                 float2 a = p - i + (i.x+i.y)*K2;
  54.                 float2 o = (a.x>a.y) ? float2(1.0,0.0) : float2(0.0,1.0); //float2 of = 0.5 + 0.5*float2(sign(a.x-a.y), sign(a.y-a.x));
  55.                 float2 b = a - o + K2;
  56.                 float2 c = a - 1.0 + 2.0*K2;
  57.                 float3 h = max(0.5-float3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 );
  58.                 float3 n = 2.*h*h*h*h*float3( dot(a,hash(i)), dot(b,hash(i+o)), dot(c,hash(i+1.0)));
  59.                 return dot(n, float3(70.,70.,70.));
  60.             }
  61.  
  62.             float fbm(float2 n) {
  63.                 float total = 0.0, amplitude = 0.1;
  64.                 for (int i = 0; i < _count; i++) {
  65.                     total += skyNoise(n) * amplitude;
  66.                     n = mul(m, n);
  67.                     amplitude *= 0.4;
  68.                 }
  69.                 return total;
  70.             }
  71.  
  72.             float noise( in float2 p )
  73.             {
  74.                 return frac((sin(p.x)+cos(p.y))*43758.5453123);
  75.                 // my tests showed that another ver. has a tiny speed difference:
  76.                 // - a little bit faster on Intel chips,
  77.                 // - but a little bit slower on Nvidia:
  78.                 //  p  = frac(p * float2(0.3247122237916646, 0.134707348285849));
  79.                 //  p += dot(p.xy, p.yx+19.19);
  80.                 //  return frac(p.x * p.y);
  81.             }
  82.  
  83.             float4 sky(in float3 rp, in float3 rd)
  84.             {
  85.                 rp += 4. * rd / rd.y;
  86.                 float2 uvbase = rp.xz;
  87.                 float q = fbm(uvbase * _cloudscale);
  88.                 float time = iTime * _speedroll;
  89.                 float3 skycolour = _skycolor;//= mix(skycolour2, skycolour1, uvbase.y);
  90.                 uvbase = uvbase * _cloudscale + time;
  91.  
  92.                 float2 uv = uvbase - q;
  93.                 float r = 0., f = 0., wr = .8, wf = .7; //skyNoise shape
  94.                 for (int i=0; i<=_count; i++) {
  95.                     r += abs(wr*skyNoise( uv ));
  96.                     f += wf*skyNoise( uv );
  97.                     uv = mul(m ,uv + time);
  98.                     wr *= .7;
  99.                     wf *= .6;
  100.                 }
  101.                 f *= r + f;
  102.                 f = .2 + 8.*f*r;
  103.  
  104.                 float c = 0., weight = .4; //skyNoise colour
  105.                 uv = uvbase * 2. - q;
  106.                 float2 uv1 = uvbase * 3. - q;
  107.                 for (int i=0; i<_count; i++) {
  108.                     c += weight*(skyNoise( uv ) + abs(skyNoise( uv1 )));
  109.                     uv = mul(m,uv + time + time);
  110.                     uv1 = mul(m,uv1 + time*3.);
  111.                     weight *= .6;
  112.                 }
  113.  
  114.                 float3 cloudcolour = float3(1.1, 1.1, 0.9) * clamp((_clouddark + _cloudlight*c), 0.0, 1.0);
  115.                 float3 result = lerp(skycolour, clamp(.5 * skycolour + cloudcolour, 0.0, 1.0), clamp(f + c, 0.0, 1.0));
  116.  
  117.                 result *= smoothstep(0.0, 0.2, rd.y);
  118.                 return float4( result, 1.0 );
  119.             }
  120.  
  121.             //-----------------------------------------------------------------------
  122.  
  123.             float4 drawImage(in float3 ro, in float3 rd )
  124.             {
  125.                 float3 rp = ro;
  126.  
  127.                 float4 fragColor = float4(1.0,1.0,1.0,1.0);
  128.                 if(true)
  129.                     if(rd.y > -0.08)
  130.                         rp += rd * 10.0;
  131.                 //fog:
  132.                 float dist = length(ro - rp);
  133.                 float3 fog = _skycolor;
  134.                 fog = lerp(fog, float3(1.0,1.0,1.0), smoothstep(0.5,-0.4, rd.y));
  135.                 fragColor.rgb = lerp(fragColor.rgb, fog, smoothstep(3.0, 10.0, dist));
  136.  
  137.                 //sky:
  138.                 if(rd.y > 0.02) fragColor = lerp(fragColor, float4(1.,1.,1.,1.), sky(ro, rd));
  139.  
  140.                 //sun halo:
  141.                 float halo = 2.053136; //pow(11.0, .3);
  142.                 if(rd.z > 0.0) halo = pow(length(rd.xy), .3);
  143.                 fragColor += clamp(1.0 - halo, 0.0, 1.0);
  144.                 float mx = max(fragColor.r, fragColor.g);
  145.                 mx = max(fragColor.b, mx);
  146.                 fragColor /= max(1.0, mx); //remove its defect
  147.  
  148.                 // contrast
  149.                 const float contr = 0.2;
  150.                 return lerp(float4(0.0,0.0,0.0,0.0), float4(1.0,1.0,1.0,1.0), fragColor * .2 + (1.0 - contr) * fragColor * fragColor * (3.0 - 2.0 * fragColor));
  151.             }
  152.  
  153.             //--------------------------------------------------------------------------
  154.  
  155.             struct custom_type
  156.             {
  157.                 fixed4 screen_vertex : SV_POSITION;
  158.                 fixed3 world_vertex : TEXCOORD1;
  159.             };
  160.  
  161.             custom_type vertex_shader (fixed4 vertex : POSITION, float2 uv:TEXCOORD0)
  162.             {
  163.                 custom_type vs;
  164.                 vs.screen_vertex = UnityObjectToClipPos (vertex);
  165.                 vs.world_vertex = mul (unity_ObjectToWorld, vertex);
  166.                 return vs;
  167.             }
  168.  
  169.             fixed4 pixel_shader(custom_type ps ) : SV_TARGET
  170.             {
  171.                 fixed3 viewDirection = normalize(ps.world_vertex - _WorldSpaceCameraPos);
  172.                 fixed3 rp = float3(0.0, 0.5, -1.0);
  173.                 rp.z += iTime * _speedwind;            
  174.                 return (drawImage(rp, viewDirection));
  175.             }
  176.             ENDCG
  177.         }
  178.     }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement