Skip to content

Instantly share code, notes, and snippets.

@smkplus
Created November 14, 2018 10:40
Show Gist options
  • Save smkplus/f8a05505d2d82d109158b62b75e56493 to your computer and use it in GitHub Desktop.
Save smkplus/f8a05505d2d82d109158b62b75e56493 to your computer and use it in GitHub Desktop.
VHS Noise
//https://www.shadertoy.com/view/XtBXDt
Shader "Hidden/Shader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
#define PI 3.14159265
float3 tex2DSample( sampler2D _tex, float2 _p ){
float3 col = tex2D( _tex, _p ).xyz;
if ( 0.5 < abs( _p.x - 0.5 ) ) {
col = float3( 0.1,0.1,0.1);
}
return col;
}
float hash( float2 _v ){
return frac( sin( dot( _v, float2( 89.44, 19.36 ) ) ) * 22189.22 );
}
float iHash( float2 _v, float2 _r ){
float h00 = hash( float2( floor( _v * _r + float2( 0.0, 0.0 ) ) / _r ) );
float h10 = hash( float2( floor( _v * _r + float2( 1.0, 0.0 ) ) / _r ) );
float h01 = hash( float2( floor( _v * _r + float2( 0.0, 1.0 ) ) / _r ) );
float h11 = hash( float2( floor( _v * _r + float2( 1.0, 1.0 ) ) / _r ) );
float2 ip = float2( smoothstep( float2( 0.0, 0.0 ), float2( 1.0, 1.0 ), fmod( _v*_r, 1. ) ) );
return ( h00 * ( 1. - ip.x ) + h10 * ip.x ) * ( 1. - ip.y ) + ( h01 * ( 1. - ip.x ) + h11 * ip.x ) * ip.y;
}
float noise( float2 _v ){
float sum = 0.;
for( int i=1; i<9; i++ )
{
float pp = 2. * pow( 2., float( i ) );
sum += iHash( _v + float2( i ,i), float2(pp,pp) / pow( 2., float( i ) ));
}
return sum;
}
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
float2 uvn = uv;
float3 col = float3(0,0,0);
// tape wave
uvn.x += ( noise( float2( uvn.y, _Time.y ) ) - 0.5 )* 0.005;
uvn.x += ( noise( float2( uvn.y * 100.0, _Time.y * 10.0 ) ) - 0.5 ) * 0.01;
// tape crease
float tcPhase = clamp( ( sin( uvn.y * 8.0 - _Time.y * PI * 1.2 ) - 0.92 ) * noise( float2( _Time.y,_Time.y ) ), 0.0, 0.01 ) * 10.0;
float tcNoise = max( noise( float2( uvn.y * 100.0, _Time.y * 10.0 ) ) - 0.5, 0.0 );
uvn.x = uvn.x - tcNoise * tcPhase;
// switching noise
float snPhase = smoothstep( 0.03, 0.0, uvn.y );
uvn.y += snPhase * 0.3;
uvn.x += snPhase * ( ( noise( float2( uv.y * 100.0, _Time.y * 10.0 ) ) - 0.5 ) * 0.2 );
col = tex2D( _MainTex, uvn );
col *= 1.0 - tcPhase;
col = lerp(
col,
col.yzx,
snPhase
);
// bloom
for( float x = -4.0; x < 2.5; x += 1.0 ){
col.xyz += float3(
tex2DSample( _MainTex, uvn + float2( x - 0.0, 0.0 ) * 7E-3 ).x,
tex2DSample( _MainTex, uvn + float2( x - 2.0, 0.0 ) * 7E-3 ).y,
tex2DSample( _MainTex, uvn + float2( x - 4.0, 0.0 ) * 7E-3 ).z
) * 0.1;
}
col *= 0.6;
// ac beat
col *= 1.0 + clamp( noise( float2( 0.0, uv.y + _Time.y * 0.2 ) ) * 0.6 - 0.25, 0.0, 0.1 );
return float4( col, 1.0 );
}
ENDCG
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment