Unity3D 旧电视滤镜shader的实现

实现思路

既然是要实现旧电视的后处理效果,那么只要回忆一下那些古旧的电视的显示效果然后进行模拟就可以了。
1.首先那种大头电视一般屏幕有一些曲率,并不是完全的一个平面,而且一般是向外凸起,这种凸起会造成中间的显示区域会比原来更近一些,边缘的显示区域会比原来更远一些。这种效果我们直接用简单的二次函数来实现。
2.那种老旧电视会有不断运动的噪声,我们直接使用噪声函数加上时间变量来实现。
3.屏幕上会有一些条纹效果,这种周期性的条纹效果一般用三角函数来实现。
当然不可能模拟的完全准确。。也没有完全准确一说。毕竟每个人对老电视的印象也是不同的,我这里也只是把我印象里的效果来实现一下,看起来差不多就行了。

实现代码

首先实现第一点,实现屏幕的曲率。
我们采用的方法是先计算该uv坐标离(0.5,0.5)的距离,这个(0.5,0.5)的uv坐标其实可以看成屏幕的中心点。计算出距离之后根据这个距离的大小来对uv进行偏移,这其中用到了一个参数_Expand 为偏移的距离。
需要注意的是dot函数里填入两次同样的向量,算出的是向量模的平方而不是向量的模,不过这正是我们需要的,可以达到平方衰减的效果。

 float d2 = dot(i.uv - half2(0.5, 0.5), i.uv - half2(0.5, 0.5));
        half2 coord = (i.uv - half2(0.5, 0.5)) * (_Expand + d2 * (1 - _Expand)) + half2(0.5, 0.5);

接下来用这个偏移后的uv坐标来对纹理进行采样。

half4 color = tex2D(_MainTex, coord);

调整参数后就会出现一些屏幕凸出的效果,当然这里整个显示范围也变小了,这里是因为如果要显示原范围的话,需要的公式太复杂了,我们这里简单起见使用了简单的公式。
原图
在这里插入图片描述
添加shader后
在这里插入图片描述
接下来添加噪声,我们用一个变量控制噪声强度,同时传入时间变量来得到噪声一直变化的效果。

   float n = simpleNoise(coord.xy * _Time.x);
   half3 result = color.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值