Advertisement
Guest User

Untitled

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