116 lines
2.9 KiB
GLSL
116 lines
2.9 KiB
GLSL
Shader "Custom/LightRays"{
|
|
Properties{
|
|
_MainTex("Texture",2D)="white"{}
|
|
_Color1("Color1",Color)=(0.1,1,1,1)
|
|
_Color2("Color2",Color)=(0,0.46,1,0)
|
|
_Speed("Speed",Range(0,5.0))=0.5
|
|
_Size("Size",Range(1.0,30.0))=15.0
|
|
_Skew("Skew",Range(-1.0,1.0))=0.5
|
|
_Shear("Shear",Range(0.0,5.0))=1.0
|
|
_Fade("Fade",Range(0.0,1.0))=1.0
|
|
_Contrast("Contrast",Range(0.0,50.0))=1.0
|
|
}
|
|
SubShader{
|
|
Tags{
|
|
"Queue"="Transparent"
|
|
"IgnoreProjector"="True"
|
|
"RenderType"="Transparent"
|
|
"PreviewType"="Plane"
|
|
}
|
|
Cull Off
|
|
Lighting Off
|
|
ZWrite Off
|
|
Fog {Mode Off}
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
Pass{
|
|
CGPROGRAM
|
|
#pragma vertex vert_img
|
|
#pragma fragment frag
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
float4 permute(float4 x){
|
|
return fmod(34.0*pow(x,2)+x,289.0);
|
|
}
|
|
|
|
float2 fade(float2 t){
|
|
return 6.0*pow(t,5.0)-15.0*pow(t,4.0)+10.0*pow(t,3.0);
|
|
}
|
|
|
|
float4 taylorInvSqrt(float4 r){
|
|
return 1.79284291400159-0.85373472095314*r;
|
|
}
|
|
|
|
#define DIV_289 0.00346020761245674740484429065744f
|
|
|
|
float mod289(float x){
|
|
return x-floor(x*DIV_289)*289.0;
|
|
}
|
|
|
|
#define REPEAT_Y 1000.0
|
|
|
|
float PerlinNoise2D(float2 P){
|
|
//Mirror the pattern on large Y number
|
|
if(floor(P.y/REPEAT_Y)%2==0){
|
|
P.y-=floor(P.y/REPEAT_Y)*REPEAT_Y;
|
|
}else{
|
|
P.y-=floor(P.y/REPEAT_Y)*REPEAT_Y;
|
|
P.y=REPEAT_Y-P.y;
|
|
}
|
|
float4 Pi=floor(P.xyxy)+float4(0.0,0.0,1.0,1.0);
|
|
float4 Pf=frac(P.xyxy)-float4(0.0,0.0,1.0,1.0);
|
|
float4 ix=Pi.xzxz;
|
|
float4 iy=Pi.yyww;
|
|
float4 fx=Pf.xzxz;
|
|
float4 fy=Pf.yyww;
|
|
float4 i=permute(permute(ix)+iy);
|
|
float4 gx=frac(i/41.0)*2.0-1.0;
|
|
float4 gy=abs(gx)-0.5;
|
|
float4 tx=floor(gx+0.5);
|
|
gx=gx-tx;
|
|
float2 g00=float2(gx.x,gy.x);
|
|
float2 g10=float2(gx.y,gy.y);
|
|
float2 g01=float2(gx.z,gy.z);
|
|
float2 g11=float2(gx.w,gy.w);
|
|
float4 norm=taylorInvSqrt(float4(dot(g00,g00),dot(g01,g01),dot(g10,g10),dot(g11,g11)));
|
|
g00*=norm.x;
|
|
g01*=norm.y;
|
|
g10*=norm.z;
|
|
g11*=norm.w;
|
|
float n00=dot(g00,float2(fx.x,fy.x));
|
|
float n10=dot(g10,float2(fx.y,fy.y));
|
|
float n01=dot(g01,float2(fx.z,fy.z));
|
|
float n11=dot(g11,float2(fx.w,fy.w));
|
|
float2 fade_xy=fade(Pf.xy);
|
|
float2 n_x=lerp(float2(n00, n01),float2(n10, n11),fade_xy.x);
|
|
float n_xy=lerp(n_x.x,n_x.y,fade_xy.y);
|
|
return 2.3*n_xy;
|
|
}
|
|
|
|
fixed4 _Color1;
|
|
fixed4 _Color2;
|
|
float _Speed;
|
|
float _Size;
|
|
float _Skew;
|
|
float _Shear;
|
|
float _Fade;
|
|
float _Contrast;
|
|
|
|
fixed4 frag(v2f_img i):SV_Target{
|
|
fixed4 color=lerp(_Color1,_Color2,1-i.uv.y);
|
|
fixed noisePos=i.uv.x;
|
|
noisePos+=-0.5;
|
|
noisePos*=_Size;
|
|
noisePos+=(1-i.uv.y)*(_Size*_Skew);
|
|
noisePos*=1/lerp(1,_Shear,1-i.uv.y);
|
|
fixed val=PerlinNoise2D(float2(noisePos,_Time.y*_Speed))/2 + 0.5f;
|
|
val=_Contrast*(val-0.5)+0.5;
|
|
color.a*=lerp(val,val*i.uv.y,_Fade);
|
|
color.a=clamp(color.a,0.0,1.0);
|
|
return color;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
}
|