This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "Custom/warp_shadertoy" { | |
Properties{ | |
/* | |
_Color ("Color", Color) = (1,1,1,1) | |
_MainTex ("Albedo (RGB)", 2D) = "white" {} | |
_Glossiness ("Smoothness", Range(0,1)) = 0.5 | |
_Metallic ("Metallic", Range(0,1)) = 0.0 | |
*/ | |
} | |
SubShader{ | |
Tags{ "RenderType" = "Opaque" } | |
LOD 200 | |
Pass{ | |
CGPROGRAM | |
#pragma vertex vert_img | |
#pragma fragment frag | |
#include "UnityCG.cginc" | |
/* | |
vec2 hash( vec2 p ) | |
{ | |
p = vec2( dot(p,vec2(127.1,311.7)), | |
dot(p,vec2(269.5,183.3)) ); | |
return -1.0 + 2.0*fract(sin(p)*43758.5453123); | |
} | |
*/ | |
fixed2 hash(fixed2 p) { | |
p = fixed2(dot(p, fixed2(127.1, 311.7)), dot(p, fixed2(269.5, 183.3))); | |
return -1.0 + 2.0 * frac(sin(p)*43758.5453123); | |
} | |
/* | |
float noise( in vec2 p ) | |
{ | |
const float K1 = 0.366025404; // (sqrt(3)-1)/2; | |
const float K2 = 0.211324865; // (3-sqrt(3))/6; | |
vec2 i = floor( p + (p.x+p.y)*K1 ); | |
vec2 a = p - i + (i.x+i.y)*K2; | |
vec2 o = (a.x>a.y) ? vec2(1.0,0.0) : vec2(0.0,1.0); //vec2 of = 0.5 + 0.5*vec2(sign(a.x-a.y), sign(a.y-a.x)); | |
vec2 b = a - o + K2; | |
vec2 c = a - 1.0 + 2.0*K2; | |
vec3 h = max( 0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 ); | |
vec3 n = h*h*h*h*vec3( dot(a,hash(i+0.0)), dot(b,hash(i+o)), dot(c,hash(i+1.0))); | |
return dot( n, vec3(70.0) ); | |
} | |
*/ | |
float noise(in fixed2 p) | |
{ | |
static const float K1 = 0.366025404; | |
static const float K2 = 0.211324865; | |
fixed2 i = floor(p + (p.x + p.y)*K1); | |
fixed2 a = p - i + (i.x + i.y)*K2; | |
fixed2 o = (a.x > a.y) ? fixed2(1.0, 0.0) : fixed2(0.0, 1.0); | |
fixed2 b = a - o + K2; | |
fixed2 c = a - 1.0 + 2.0*K2; | |
fixed3 h = max(0.5 - fixed3(dot(a, a), dot(b, b), dot(c, c)), 0.0); | |
fixed3 n = h*h*h*h*fixed3(dot(a, hash(i + 0.0)), dot(b, hash(i + o)), dot(c, hash(i + 1.0))); | |
return dot(n, fixed3(70.0, 70.0, 70.0)); | |
} | |
static const float2x2 m = float2x2(0.80, -0.60, 0.60, 0.80); | |
/* | |
float fbm4( in vec2 p ) | |
{ | |
float f = 0.0; | |
f += 0.5000*noise( p ); p = m*p*2.02; | |
f += 0.2500*noise( p ); p = m*p*2.03; | |
f += 0.1250*noise( p ); p = m*p*2.01; | |
f += 0.0625*noise( p ); | |
return f; | |
} | |
*/ | |
float fbm4(in fixed2 p) | |
{ | |
float f = 0.0; | |
f += 0.5000*noise(p); | |
p = mul(p,m)*2.02; | |
f += 0.2500*noise(p); | |
p = mul(p, m)*2.03; | |
f += 0.1250*noise(p); | |
p = mul(p, m)*2.01; | |
f += 0.0625*noise(p); | |
return f; | |
} | |
/* | |
float fbm6( in vec2 p ) | |
{ | |
float f = 0.0; | |
f += 0.5000*noise( p ); p = m*p*2.02; | |
f += 0.2500*noise( p ); p = m*p*2.03; | |
f += 0.1250*noise( p ); p = m*p*2.01; | |
f += 0.0625*noise( p ); p = m*p*2.04; | |
f += 0.031250*noise( p ); p = m*p*2.01; | |
f += 0.015625*noise( p ); | |
return f; | |
} | |
*/ | |
float fbm6(in fixed2 p) | |
{ | |
float f = 0.0; | |
f += 0.5000*noise(p); | |
p = mul(p, m)*2.02; | |
f += 0.2500*noise(p); | |
p = mul(p, m)*2.03; | |
f += 0.1250*noise(p); | |
p = mul(p, m)*2.01; | |
f += 0.0625*noise(p); | |
p = mul(p, m)*2.04; | |
f += 0.031250*noise(p); | |
p = mul(p, m)*2.01; | |
f += 0.015625*noise(p); | |
return f; | |
} | |
float turb4(in fixed2 p) | |
{ | |
float f = 0.0; | |
f += 0.5000*abs(noise(p)); p = mul(p, m)*2.02; | |
f += 0.2500*abs(noise(p)); p = mul(p, m)*2.03; | |
f += 0.1250*abs(noise(p)); p = mul(p, m)*2.01; | |
f += 0.0625*abs(noise(p)); | |
return f; | |
} | |
float turb6(in fixed2 p) | |
{ | |
float f = 0.0; | |
f += 0.5000*abs(noise(p)); p = mul(p, m)*2.02; | |
f += 0.2500*abs(noise(p)); p = mul(p, m)*2.03; | |
f += 0.1250*abs(noise(p)); p = mul(p, m)*2.01; | |
f += 0.0625*abs(noise(p)); p = mul(p, m)*2.04; | |
f += 0.031250*abs(noise(p)); p = mul(p, m)*2.01; | |
f += 0.015625*abs(noise(p)); | |
return f; | |
} | |
float marble(in fixed2 p) | |
{ | |
return cos(p.x + fbm4(p)); | |
} | |
float wood(in fixed2 p) | |
{ | |
float n = noise(p); | |
return n - floor(n); | |
} | |
float dowarp(in fixed2 q, out fixed2 a, out fixed2 b) | |
{ | |
float ang = 0.; | |
ang = 1.2345 * sin(0.015*_Time.y); | |
float2x2 m1 = float2x2(cos(ang), sin(ang), -sin(ang), cos(ang)); | |
ang = 0.2345 * sin(0.021*_Time.y); | |
float2x2 m2 = float2x2(cos(ang), sin(ang), -sin(ang), cos(ang)); | |
a = fixed2(marble(mul(q,m1)), marble(mul(q,m2) + fixed2(1.12, 0.654))); | |
ang = 0.543 * cos(0.011*_Time.y); | |
m1 = float2x2(cos(ang), sin(ang), -sin(ang), cos(ang)); | |
ang = 1.128 * cos(0.018*_Time.y); | |
m2 = float2x2(cos(ang), sin(ang), -sin(ang), cos(ang)); | |
//b = fixed2(marble(m2*(q + a)), marble(m1*(q + a))); | |
b = fixed2(marble(mul((q+a),m2)), marble((mul((q + a), m1)))); | |
return marble(q + b + fixed2(0.32, 1.654)); | |
} | |
fixed4 frag(v2f_img i) : SV_Target | |
{ | |
fixed2 uv = (i.uv*_ScreenParams.xy) / _ScreenParams.xy; | |
fixed2 q = 2.*uv - 1.; | |
//q.y *= _ScreenParams.y / _ScreenParams.x; | |
q.y = mul(q.y, (_ScreenParams.y / _ScreenParams.x)); | |
float Time = 0.1*_Time.y; | |
q += fixed2(4.0*sin(Time), 0.); | |
//q *= 1.725; | |
q = mul(q, 1.725); | |
fixed2 a = fixed2(0., 0.); | |
fixed2 b = fixed2(0., 0.); | |
float f = dowarp(q, a, b); | |
f = 0.5 + 0.5*f; | |
fixed3 col = fixed3(f, f, f); | |
float c = 0.; | |
c = f; | |
col = fixed3(c, c*c, c*c*c); | |
c = abs(a.x); | |
col -= fixed3(c*c, c, c*c*c); | |
c = abs(b.x); | |
col += fixed3(c*c*c, c*c, c); | |
//col *= 0.7; | |
col = mul(col, 0.7); | |
col.x = pow(col.x, 2.18); | |
// col.y = pow(col.y, 1.58); | |
col.z = pow(col.z, 1.88); | |
col = smoothstep(0., 1., col); | |
col = 0.5 - (1.4*col - 0.7)*(1.4*col - 0.7); | |
col = 1.25*sqrt(col); | |
col = clamp(col, 0., 1.); | |
// Vignetting | |
//fixed2 r = -1.0 + 2.0*(uv); | |
//float vb = max(abs(r.x), abs(r.y)); | |
//col *= (0.15 + 0.85*(1.0 - exp(-(1.0 - vb)*30.0))); | |
//col = mul(col, 0.15 + 0.85*(1.0 - exp(-(1.0 - vb)*30.0))); | |
//fragColor = vec4(col, 1.0); | |
return fixed4(col.x, col.y, col.z, 1.0); | |
} | |
ENDCG | |
} | |
} | |
FallBack "Diffuse" | |
} | |
/* | |
////////////////////////////////////////////////// | |
// XBE | |
// See Yaw 2 (Yet Yet Another Warping) | |
// More colorfull version | |
// Simplex Noise by IQ | |
vec2 hash( vec2 p ) | |
{ | |
p = vec2( dot(p,vec2(127.1,311.7)), | |
dot(p,vec2(269.5,183.3)) ); | |
return -1.0 + 2.0*fract(sin(p)*43758.5453123); | |
} | |
float noise( in vec2 p ) | |
{ | |
const float K1 = 0.366025404; // (sqrt(3)-1)/2; | |
const float K2 = 0.211324865; // (3-sqrt(3))/6; | |
vec2 i = floor( p + (p.x+p.y)*K1 ); | |
vec2 a = p - i + (i.x+i.y)*K2; | |
vec2 o = (a.x>a.y) ? vec2(1.0,0.0) : vec2(0.0,1.0); //vec2 of = 0.5 + 0.5*vec2(sign(a.x-a.y), sign(a.y-a.x)); | |
vec2 b = a - o + K2; | |
vec2 c = a - 1.0 + 2.0*K2; | |
vec3 h = max( 0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 ); | |
vec3 n = h*h*h*h*vec3( dot(a,hash(i+0.0)), dot(b,hash(i+o)), dot(c,hash(i+1.0))); | |
return dot( n, vec3(70.0) ); | |
} | |
const mat2 m = mat2( 0.80, 0.60, -0.60, 0.80 ); | |
float fbm4( in vec2 p ) | |
{ | |
float f = 0.0; | |
f += 0.5000*noise( p ); p = m*p*2.02; | |
f += 0.2500*noise( p ); p = m*p*2.03; | |
f += 0.1250*noise( p ); p = m*p*2.01; | |
f += 0.0625*noise( p ); | |
return f; | |
} | |
float fbm6( in vec2 p ) | |
{ | |
float f = 0.0; | |
f += 0.5000*noise( p ); p = m*p*2.02; | |
f += 0.2500*noise( p ); p = m*p*2.03; | |
f += 0.1250*noise( p ); p = m*p*2.01; | |
f += 0.0625*noise( p ); p = m*p*2.04; | |
f += 0.031250*noise( p ); p = m*p*2.01; | |
f += 0.015625*noise( p ); | |
return f; | |
} | |
float turb4( in vec2 p ) | |
{ | |
float f = 0.0; | |
f += 0.5000*abs(noise(p)); p = m*p*2.02; | |
f += 0.2500*abs(noise(p)); p = m*p*2.03; | |
f += 0.1250*abs(noise(p)); p = m*p*2.01; | |
f += 0.0625*abs(noise(p)); | |
return f; | |
} | |
float turb6( in vec2 p ) | |
{ | |
float f = 0.0; | |
f += 0.5000*abs(noise(p)); p = m*p*2.02; | |
f += 0.2500*abs(noise(p)); p = m*p*2.03; | |
f += 0.1250*abs(noise(p)); p = m*p*2.01; | |
f += 0.0625*abs(noise(p)); p = m*p*2.04; | |
f += 0.031250*abs(noise(p)); p = m*p*2.01; | |
f += 0.015625*abs(noise(p)); | |
return f; | |
} | |
float marble(in vec2 p) | |
{ | |
return cos(p.x+fbm4(p)); | |
} | |
float wood(in vec2 p) | |
{ | |
float n = noise(p); | |
return n-floor(n); | |
} | |
float dowarp ( in vec2 q, out vec2 a, out vec2 b ) | |
{ | |
float ang=0.; | |
ang = 1.2345 * sin (0.015*iGlobalTime); | |
mat2 m1 = mat2(cos(ang), -sin(ang), sin(ang), cos(ang)); | |
ang = 0.2345 * sin (0.021*iGlobalTime); | |
mat2 m2 = mat2(cos(ang), -sin(ang), sin(ang), cos(ang)); | |
a = vec2( marble(m1*q), marble(m2*q+vec2(1.12,0.654)) ); | |
ang = 0.543 * cos (0.011*iGlobalTime); | |
m1 = mat2(cos(ang), -sin(ang), sin(ang), cos(ang)); | |
ang = 1.128 * cos (0.018*iGlobalTime); | |
m2 = mat2(cos(ang), -sin(ang), sin(ang), cos(ang)); | |
b = vec2( marble( m2*(q + a)), marble( m1*(q + a) ) ); | |
return marble( q + b +vec2(0.32,1.654)); | |
} | |
// ----------------------------------------------- | |
void mainImage( out vec4 fragColor, in vec2 fragCoord ) | |
{ | |
vec2 uv = fragCoord.xy / iResolution.xy; | |
vec2 q = 2.*uv-1.; | |
q.y *= iResolution.y/iResolution.x; | |
float Time = 0.1*iGlobalTime; | |
q += vec2( 4.0*sin(Time), 0.); | |
q *= 1.725; | |
vec2 a = vec2(0.); | |
vec2 b = vec2(0.); | |
float f = dowarp(q, a, b); | |
f = 0.5+0.5*f; | |
vec3 col = vec3(f); | |
float c = 0.; | |
c = f; | |
col = vec3(c, c*c, c*c*c); | |
c = abs(a.x); | |
col -= vec3(c*c, c, c*c*c); | |
c = abs(b.x); | |
col += vec3(c*c*c, c*c, c); | |
col *= 0.7; | |
col.x = pow(col.x, 2.18); | |
// col.y = pow(col.y, 1.58); | |
col.z = pow(col.z, 1.88); | |
col = smoothstep(0., 1., col); | |
col = 0.5 - (1.4*col-0.7)*(1.4*col-0.7); | |
col = 1.25*sqrt(col); | |
col = clamp(col, 0., 1.); | |
// Vignetting | |
vec2 r = -1.0 + 2.0*(uv); | |
float vb = max(abs(r.x), abs(r.y)); | |
col *= (0.15 + 0.85*(1.0-exp(-(1.0-vb)*30.0))); | |
fragColor = vec4( col, 1.0 ); | |
} | |
*/ |