参考:- 高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现 - RGB颜色分离故障(RGB Split Glitch)
Split RGB 通道只是其一一种效果
思路
Split RGB 还是比较简单的
- 现有类似 noise 的 抖动函数
- 使用 noise 得到的值作为 R, B 通道的偏移采样
使用 GGB 查看函数变换情况
参数截图
变化率图
通过 sin 各种波段叠合的波,在作为底数,让后添加一个 amplitude 指数,即可得到一个看起来不怎么有重复周期的波段
Code
Shader
// jave.lin 2021/06/07
// 测试 分离通道故障后效
// References : 高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现
// https://qianmo.blog.csdn.net/article/details/106753402
Shader "Test/PP/SplitRGBPP"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Amplitude ("Amplitude", Range(-0.2, 0)) = -0.15
_Amount ("Amount", Range(-5, 5)) = 0.5
}
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;
float _Amplitude;
float _Amount;
float Noise()
{
float _TimeX = _Time.y;
float splitAmout = (1.0 + sin(_TimeX * 6.0)) * 0.5;
splitAmout *= 1.0 + sin(_TimeX * 16.0) * 0.5;
splitAmout *= 1.0 + sin(_TimeX * 19.0) * 0.5;
splitAmout *= 1.0 + sin(_TimeX * 27.0) * 0.5;
splitAmout = pow(splitAmout, _Amplitude);
splitAmout *= (0.05 * _Amount);
return splitAmout;
}
half4 SplitRGB(v2f i)
{
float splitAmout = Noise();
half3 finalColor;
finalColor.r = tex2D(_MainTex, fixed2(i.uv.x + splitAmout, i.uv.y)).r;
finalColor.g = tex2D(_MainTex, i.uv).g;
finalColor.b = tex2D(_MainTex, fixed2(i.uv.x - splitAmout, i.uv.y)).b;
return half4(finalColor, 1.0);
}
fixed4 frag(v2f i) : SV_Target
{
return SplitRGB(i);
}
ENDCG
}
}
}
效果
Back Project
不公开项目(因设置以前公司使用的资源,就自己备份学习、回顾用)
TestingRGBSplitGlitch_unity 2019.4.0f1
References
- 高品质后处理:十种故障艺术(Glitch Art)算法的总结与实现 - RGB颜色分离故障(RGB Split Glitch)