かんたんエフェクト加工シェーダー
https://gyazo.com/474228b1a543fbd855babc3d16e63471
お手軽に一枚絵に加工を加えることができるシェーダーコードを集めました。
テクスチャ画像にエフェクトを加える用途を想定していますが、計算式で描いた絵を加工するのにも使えます。
UnityでUnlitシェーダー作って書き換えるだけで動きます!!
もくじ
色反転
繰り返し
移動(UVスクロール)
歪み
モザイク
集中線
短冊切り
RGBシフト/色収差
バレルディストーション
反転
ブラー
ヴィネット/Vignette
色収差/Chromatic Abberation
グレースケール
セピア
デュオトーン
トンネル
ddxとddyでボヤけさせる
もはやかんたんではなかった
グリッチ
エッジ抽出
カメラの水滴
さらに書き足す
カラーグレーディング
Vibrance
ディストーション
スクリーントーンシェーダー
ブラー
ガウシアン
ナイトスコープ的なポスプロ実装
背景色にグレイスケールとヴィネットとノイズを乗算して出力
glitchを描く
座標に対してブロックを定義/モザイクのアルゴリズムと同様
ブロックを元にノイズを求める
ノイズに対して閾値でstepを求める *1
時間によるホワイトノイズを求める *2
*1 と *2を乗算したものをテクスチャ座標に加える
灰色の砂嵐画面を作る
https://gyazo.com/6c4e53bb3465d9ddf45ab1bf696385f2.png
色反転
https://gyazo.com/554862b8caad0eefc701521b411bc3a5
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return 1. - col;
}
繰り返し
https://gyazo.com/8ef0a4919dd445483fbc78d39a24db34
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
uv *= 3;
fixed4 col = tex2D(_MainTex, uv);
return col;
}
移動(UVスクロール)
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
uv += frac(_Time.y);
fixed4 col = tex2D(_MainTex, uv);
return col;
}
右上から左下に向かってテクスチャが動く。
横移動をしたいならuv.x += frac(_Time.y)、縦移動をしたいならuv.y += frac(_Time.y)のようにすれば良い。
https://gyazo.com/0d3171a69bc4ef7d8522f835bee18792
歪み
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
uv.x += frac(uv.y * 2);
fixed4 col = tex2D(_MainTex, uv);
return col;
}
https://gyazo.com/807fc87d8ea7d2dcde44aea7991f012b
モザイク
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
uv = floor(uv / 20.) * 20.;
fixed4 col = tex2D(_MainTex, uv);
return col;
}
https://gyazo.com/6f2b2a9abe5414fadd592fe532f38be9
floorしているため、イメージ全体の座標がちょっとズレるのがいまいちかもしれません。
ceilも取得した上で平均を取ると緩和されます。
uv = 0.5 * (floor(uv / 20.) + ceil(uv / 20.)) * 20.;
集中線
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = 2 * i.uv - 1;
float r = length(uv);
r = 0.7 * r - 0.7;
float a = atan2(uv.y, uv.x);
a = abs(cos(50 * a) + sin(20 * a));
float d = a - r;
float n = smoothstep(0.1, 0.4, saturate(d));
fixed4 col = tex2D(_MainTex, i.uv);
return n * col;
}
https://gyazo.com/272a67ccca45b7184c2b7f94a3753d76
短冊切り
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
uv.x += sin(floor(4 * uv.y) - _Time.y);
//uv.x += cos(floor(4 * uv.x) + _Time.y);
fixed4 col = tex2D(_MainTex, uv);
return col;
}
https://gyazo.com/8c888df4470e5e13f889d235f6c58cd4
RGBシフト
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
float r = tex2D(_MainTex, uv + 0.1 * sin(_Time.y)).r;
float b = tex2D(_MainTex, uv - 0.1 * sin(_Time.y)).b;
float2 ga = tex2D(_MainTex, uv).ga;
return fixed4(r, ga.x, b, ga.y);
}
https://gyazo.com/608388e83ef8ff11d0ca0e38fafc6770
反転
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
uv.x += step(sin(_Time.y), 0) * (1 - 2 * uv.x);
uv.y += step(sin(_Time.y), 0) * (1 - 2 * uv.y);
fixed4 col = tex2D(_MainTex, uv);
return col;
}
https://gyazo.com/99cc517466df6da95b7c59a926307dde
ブラー
code:HLSL
float4 _MainTex_TexelSize;
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
float2 dir = -uv;
float d = length(dir);
dir = normalize(dir) * _MainTex_TexelSize.xy;
dir *= 1.2 * d;
fixed4 col = tex2D(_MainTex, uv) * 0.19;
for (int j = 1; j < 10; j++) {
col += tex2D(_MainTex, uv + dir * j) * (0.19 - j * 0.02);
}
return col;
}
https://gyazo.com/43df2d5b9396d00acf25d9547ff704fa
ヴィネット/Vignette
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
fixed4 col = tex2D(_MainTex, i.uv);
uv = 2. * uv - 1.;
col *= 1.0 - dot(uv, uv);
return col;
}
https://gyazo.com/33bd5a7ead354f190461ac3543b009cc
code:Vignetting.GLSL
// vignetting
vec2 q = fragCoord.xy/iResolution.xy;
col *= 0.5 + 0.5*pow(16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y),0.25);
code:Vignette.GLSL
float Vignette(vec2 uv)
{
float vignette = uv.x * uv.y * ( 1.0 - uv.x ) * ( 1.0 - uv.y );
return clamp( pow( 16.0 * vignette, 0.3 ), 0.0, 1.0 );
}
バレルディストーション
code:Barrel.HLSL
float2 barrel(float2 uv)
{
float s1 = .99, s2 = .125;
float2 centre = 2.*uv - 1.;
float barrel = min(1. - length(centre)*s1, 1.0)*s2;
return uv - centre * barrel;
}
float2 p = barrel(i.uv);
fixed4 col = tex2D(_MainTex, p);
code:Barrel.GLSL
// バレルディストーション
float s1=.25,s2=10.;
vec2 centre=2.*gl_FragCoord.xy-1.;
float barrel=max(1.-length(centre)*s1,.0)*s2;
vec4 p=vec4((gl_FragCoord.xy- .5*resolution.xy) / min(resolution.x,resolution.y)-centre*barrel,.05,.05);
ブラウン管画面風
code:CRT.HLSL
float2 CRT(float2 uv)
{
float2 nu = uv * 2. - 1.;
float2 offset = abs(nu.yx) / float2(6., 4.);
nu += nu * offset*offset;
return nu;
}
float2 crt = CRT(i.uv);
crt = abs(crt);
crt = pow(crt, 15.);
col.rgb = lerp(col.rgb, (.0).xxx, crt.x+crt.y);
code:CRT.GLSL
vec2 CRT(vec2 uv)
{
uv=uv*2.-1.;
vec2 offset = abs(uv.yx)/vec2(6.,4.);
uv+=uv*offset*offset;
uv=uv*.5+.5;
return uv;
}
vec2 crt=CRT(bp);
if (crt.x<.0||crt.x>1.||crt.y<.0||crt.y>1.) col=vec3(0.);
スキャンライン
code:Scanline.HLSL
float Scanline(float2 uv)
{
float scanline = clamp(0.95 + 0.05 * cos(3.14 * (uv.y + 0.008 * _Time.y) * 240.0 * 1.0), 0.0, 1.0);
float grille = 0.85 + 0.15 * clamp(1.5 * cos(3.14 * uv.x * 640.0 * 1.0), 0.0, 1.0);
return scanline * grille * 1.2;
}
col.rgb *= Scanline(i.uv);
code:Scanline.GLSL
float Scanline(vec2 uv)
{
float scanline = clamp( 0.95 + 0.05 * cos( 3.14 * ( uv.y + 0.008 * time ) * 240.0 * 1.0 ), 0.0, 1.0 );
float grille = 0.85 + 0.15 * clamp( 1.5 * cos( 3.14 * uv.x * 640.0 * 1.0 ), 0.0, 1.0 );
return scanline * grille * 1.2;
}
カラーグレーディング
code:ColorGrading.HLSL
// color grading
col.rgb *= float3(1.25, 0.95, 0.7);
col.rgb = clamp(col.rgb, 0.0, 1.0);
col.rgb = col.rgb * col.rgb * (3.0 - 2.0 * col.rgb);
col.rgb = .5 + .5*col.rgb;
code:ColorGrading.GLSL
col *= vec3(1.05,0.95,0.9);
col = clamp(col, 0.0, 1.0);
col = col * 0.5 + 0.5 * col * col * (3.0 - 2.0 * col);
色収差/Chromatic Aberration
TODO : なんか書いて
グレースケール
lightness: (max(r, g, b) + min(r, g, b)) / 2.
average: (r + g + b) / 3.
pow average: r*r + g*g + b*b
luminosity: 0.21 * r + 0.72 * g + 0.07 * b
dot(color.rgb, float3(0.2126729, 0.7151522, 0.0721750))
length: length(rgb)
ITU-R Rec BT.601: dot(col, vec3(0.298912, 0.586611, 0.114478))
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = tex2D(_MainTex, i.uv);
return c.x*c.x + c.y*c.y + c.z*c.z;
}
https://gyazo.com/1904297cc6603ec43ba01595270fc4f0
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = tex2D(_MainTex, i.uv);
return 0.21 * c.x + 0.72 * c.y + 0.07 * c.z;
}
https://gyazo.com/9afe7046fb1cf69e217d58203a1d0000
セピア
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = tex2D(_MainTex, i.uv);
float gray = 0.21 * c.x + 0.72 * c.y + 0.07 * c.z;
float4 s = float4(.6, .5, .4, 1);
return lerp(s, 1.2 * s, gray);
}
https://gyazo.com/8e36672757bb2e5febb4c964b5f88689
デュオトーン
code:HLSL
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = tex2D(_MainTex, i.uv);
float gray = 0.21 * c.x + 0.72 * c.y + 0.07 * c.z;
float4 d1 = float4(195, 201, 13, 255) / 255;
float4 d2 = float4(136, 241, 48, 255) / 255;
return lerp(d1, d2, gray);
}
https://gyazo.com/ef8f62d424e5d93bca2bde57050a92ee
https://gyazo.com/7c7c169a20554d5d8cd75f7020be5c29
カラーパレット参考
トンネル
code:HLSL
fixed4 frag (v2f_img i) : SV_Target
{
float2 uv = 2. * i.uv - 1.;
float d = 1. / length(uv);
uv = float2(d, atan2(uv.y, uv.x) / UNITY_TWO_PI);
fixed4 col = tex2D(_MainTex, uv);
fixed4 c = (2. - d) * col;
return c;
}
https://gyazo.com/0d4333574d2f12e606ec424a329eec87
ddxとddyでボヤけさせる
code:HLSL
fixed4 frag (v2f_img i) : SV_Target
{
float EPS = 0.07;
fixed4 col = tex2D(_MainTex, i.uv, (EPS).xx, (EPS).xx);
return col;
}
https://gyazo.com/4a3b03acc02b8055524493770a6f5eb8
グリッチ
自分のグリッチを作りたい
エッジ抽出
Roberts Cross Edge Detectorってやつで実装してみたい
fwidthという関数がある
カメラの水滴
https://gyazo.com/d3ca1bdf5e2dcef27981255ba0479997