Skip to content

Commit af035d5

Browse files
committedJun 14, 2020
修订文章 《高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现》
修订文章 《高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现》
1 parent 3549bd6 commit af035d5

File tree

2 files changed

+29
-16
lines changed
  • Content/高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现

2 files changed

+29
-16
lines changed
 

‎Content/高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现/README.md

+29-16
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
<br>
4242

43-
# 关于XPL: Unity引擎的高品质后处理库
43+
# 关于XPL : Unity引擎的高品质后处理库
4444

4545

4646
另外,本文涉及的十种故障艺术(Glitch Art)后处理的实现源码,都收录于本人开源的后处理算法库XPL中。
@@ -51,7 +51,7 @@ X-PostProcessing Libray,简称XPL,是本人开发的Unity引擎下的高品
5151

5252
![](media/debda36941aa6564c6b8b8b38ef9d318.jpg)
5353

54-
截止本文发表,目前已以开源的形式放出了17种图像模糊后处理算法、10种像素化型后处理算法、9种边缘检测型后处理算法、17种故障艺术型后处理算法。而随着后续更多内容的公开,X-PostProcessing
54+
截止本文发表,目前已以开源的形式放出了17种图像模糊型后处理算法、10种像素化型后处理算法、9种边缘检测型后处理算法、17种故障艺术型后处理算法。而随着后续更多内容的公开,X-PostProcessing
5555
Libray将成型为一个具有100+种后处理特效的高品质后处理开源算法库。
5656

5757
<br>
@@ -85,7 +85,7 @@ Libray将成型为一个具有100+种后处理特效的高品质后处理开源
8585

8686
图 《看门狗2》中的故障艺术表现形式 @ Ubisoft
8787

88-
这里也放一段包含各种故障艺术(Glitch Art)元素的《赛博朋克2077》 2019 E3展预告片段:
88+
这里也放一段包含多种故障艺术(Glitch Art)元素的《赛博朋克2077》 2019 E3展预告片段:
8989

9090
【《赛博朋克2077》 2019 E3展预告片段】 <https://www.youtube.com/watch?v=qIcTM8WXFjk>
9191

@@ -168,7 +168,7 @@ RGB颜色分离故障(RGB Split Glitch),实现算法的主要要点在于
168168

169169
![](media/97fa0c1b7f14497c48ae9574e7d7ea8f.gif)
170170

171-
详细实现源码可见
171+
此版本的实现源码可见
172172

173173
<https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/GlitchRGBSplitV2>
174174

@@ -222,7 +222,7 @@ Split后处理特效,以满足不同情形下RGB颜色抖动风格的需要。
222222

223223
half2 block = randomNoise(floor(i.texcoord * _BlockSize));
224224

225-
这句代码可以生成随机强度的均匀Block图块
225+
基于这句代码可以生成随机强度的均匀Block图块
226226

227227
![](media/a0ff7e1c447a3416e1466f75b1ca0a9b.gif)
228228

@@ -252,7 +252,7 @@ half displaceNoise = pow(block.x, 8.0) * pow(block.x, 3.0);
252252
![](media/d6248833de3a7111dbca499cdc955df9.gif)
253253

254254

255-
以上基础错位图块故障(Image Block Glitch)实现的完整源代码可见:
255+
以上基础版本的错位图块故障(Image Block Glitch)实现的完整源代码可见:
256256

257257
<https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/GlitchImageBlockV3>
258258

@@ -294,7 +294,7 @@ half displaceNoise = pow(block.x, 8.0) * pow(block.x, 3.0);
294294
}
295295

296296

297-
最终表现如下
297+
对应的渲染表现如下
298298

299299
![](media/ce0f22d2a51d470b499b27bb3da10d3a.gif)
300300

@@ -390,16 +390,20 @@ float uv_randomTrunc = 6.0 * trunc(_TimeX, 24.0 * uv_trunc);
390390
blockLine_random = sign(blockLine_random) * saturate((abs(blockLine_random) - _Amount) / (0.4));
391391
blockLine_random = lerp(0, blockLine_random, _Offset);
392392

393+
可以得到如下的渲染表现:
393394

394395
![](media/1689ba7c27383f6db417dd35b764cdf3.gif)
395396

397+
396398
接着,通过随机梯度的非等宽线条,去抖动uv采样生成源色调的blockLine Glitch:
397399

398400
// 生成源色调的blockLine Glitch
399401
float2 uv_blockLine = uv;
400402
uv_blockLine = saturate(uv_blockLine + float2(0.1 * blockLine_random, 0));
401403
float4 blockLineColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, abs(uv_blockLine));
402404

405+
对应的渲染表现如下:
406+
403407

404408
![](media/4d170f6ed0453120c2f5b3a3b7b4c1a2.gif)
405409

@@ -424,7 +428,7 @@ float uv_randomTrunc = 6.0 * trunc(_TimeX, 24.0 * uv_trunc);
424428

425429
![](media/4b96ce25c89d300d3bb7245bd8af2eec.gif)
426430

427-
当然还可以将上述渲染效果与原始场景图进行插值混合,得到不同强度的渲染表现。
431+
当然,也可以将上述渲染效果与原始场景图进行插值混合,得到不同强度的渲染表现。
428432

429433
XPL中实现的错位线条故障(Line Block Glitch)后处理,有7个可供定制调节的参数:
430434

@@ -522,6 +526,10 @@ XPL中实现的错位线条故障(Line Block Glitch)后处理,有7个可
522526

523527
![](media/f6645202c3717b8609086b3e92a3a750.gif)
524528

529+
也可以从竖直方向进行uv的抖动:
530+
![](media/39.1.gif)
531+
532+
525533
扫描线抖动故障(Scan Line Jitter Glitch)完整的实现源代码可见:
526534

527535
<https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/GlitchScanLineJitter>
@@ -651,7 +659,6 @@ Noise最终的渲染表现:
651659
# 八、屏幕跳跃故障(Screen Jump Glitch)
652660

653661

654-
![](media/33fb0f93f870af94fac2e0f944202d54.gif)
655662

656663
屏幕跳跃故障(Screen Jump Glitch)的算法原理在于取经过时间校正后的uv数值的小数部分,并于原始uv插值,得到均匀梯度式扰动屏幕空间uv,再用此uv进行采样即可得到跳动画面的表现。核心实现Shader代码如下:
657664

@@ -684,9 +691,9 @@ Noise最终的渲染表现:
684691

685692
![](media/496be98975fbb3dfda2acb0ed5e0e15b.gif)
686693

687-
屏幕跳跃故障(Screen Jump Glitch)详细的实现源码可见
694+
屏幕跳跃故障(Screen Jump Glitch)完整的实现源码可见
688695

689-
<https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/GlitchScreenShake>
696+
<https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/GlitchScreenJump>
690697

691698
<br>
692699

@@ -731,6 +738,12 @@ Noise最终的渲染表现:
731738
![](media/d287de98424bf1b8de486bf69ad697a4.gif)
732739

733740

741+
742+
屏幕抖动故障(Screen Shake Glitch)完整的实现源码可见:
743+
744+
<https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/GlitchScreenShake>
745+
746+
734747
<br>
735748

736749
# 十、波动抖动故障(Wave Jitter Glitch)
@@ -794,7 +807,7 @@ OK,回到我们的波动抖动故障(Wave Jitter Glitch)后处理中来。
794807
strength = 0.5 + 0.5 *cos(_Time.y * _Frequency);
795808
#endif
796809
797-
// --------------------------------Prepare UV----------------------------
810+
// Prepare UV
798811
float uv_y = i.texcoord.y * _Resolution.y;
799812
float noise_wave_1 = snoise(float2(uv_y * 0.01, _Time.y * _Speed * 20)) * (strength * _Amount * 32.0);
800813
float noise_wave_2 = snoise(float2(uv_y * 0.02, _Time.y * _Speed * 10)) * (strength * _Amount * 4.0);
@@ -803,11 +816,11 @@ OK,回到我们的波动抖动故障(Wave Jitter Glitch)后处理中来。
803816

804817
float rgbSplit_uv_x = (_RGBSplit * 50 + (20.0 * strength + 1.0)) * noise_wave_x / _Resolution.x;
805818

806-
// -------------------------------Sample RGB Color------------------------------
807-
float4 colorG = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, float2(uv_x, i.texcoord.y));
808-
float4 colorRB = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, float2(uv_x + rgbSplit_uv_x, i.texcoord.y));
819+
// Sample RGB Color
820+
half4 colorG = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, float2(uv_x, i.texcoord.y));
821+
half4 colorRB = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, float2(uv_x + rgbSplit_uv_x, i.texcoord.y));
809822
810-
return float4(colorRB.r, colorG.g, colorRB.b, colorRB.a + colorG.a);
823+
return half4(colorRB.r, colorG.g, colorRB.b, colorRB.a + colorG.a);
811824
}
812825

813826
得到的渲染表现如下:

0 commit comments

Comments
 (0)
Failed to load comments.