Unity3D如何实现旧电视滤镜阴凉处

  介绍

这篇文章主要介绍了Unity3D如何实现旧电视滤镜阴影,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

实现思路

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

实现代码

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

, float  d2 =,点(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);

调整参数后就会出现一些屏幕凸出的效果,当然这里整个显示范围也变小了,这里是因为如果要显示原范围的话,需要的公式太复杂了,我们这里简单起见使用了简单的公式。

原图

 Unity3D如何实现旧电视滤镜影”> <br/> </p> <p>添加材质后<br/> </p> <p> <img src=,,, float  n =, simpleNoise (coord.xy  *, _Time.x);   ,,half3  result =, color.rgb  *, (1 -_NoiseIntensity), +, _NoiseIntensity  *, n;

而噪声函数具体的实现如下
至于为什么这个函数就可以得到噪声,其实也不好解释。大致就是罪函数倍增之后加上取小数的压裂函数可以近似得到一种随机数的效果吧。

float  simpleNoise (float2 紫外线)   ,,,{   ,,,,,,,return 压裂(罪(点(uv, float2 (12.9898, 78.233))), *, 43758.5453);   ,,,}

效果如下

 Unity3D如何实现旧电视滤镜影”> <br/> </p> <p>最后添加上条纹效果<br/> </p> <p>这个公式也不是什么经过精心推导的公式,只是因为我们需要一个周期出现的条纹效果,然后就想到用罪和因为函数,然后随便调整一下看起来有点样子就可以了</p> <pre类= half2  sc =, half2((罪(coord.y  *, _StripeIntensity), +, - 1),/,,,(因为(coord.y  *, _StripeIntensity), +, - 1),/, 2);   result  +=, color.rgb  *, sc.xyx;

添加条纹之后

 Unity3D如何实现旧电视滤镜影”> <br/> </p> <p>效果2 <br/> </p> <p> <img src=

完整代码

c#代码

namespace 丰富多彩   {   ,,,using  UnityEngine;         ,,,(ExecuteInEditMode)   ,,,public  class  OldTV : MonoBehaviour   ,,,{   ,,,,,,,public ,,,,,,,,,,,,,, Shader 材质;   ,,,,,,,(范围(0,1)),public  float , Expand ,,,,,,,,,=, 0.7 f;   ,,,,,,,(范围(0,1)),public  float , NoiseIntensity ,=, 0.3 f;   ,,,,,,,public ,,,,,,,,,,,,,, int ,,, StripeIntensity =, 500;         ,,,,,,,protected  void  OnRenderImage (RenderTexture 源,RenderTexture 目的地)   ,,,,,,,{   ,,,,,,,,,,,Material  Material =, new 材料(材质);   ,,,,,,,,,,,material.SetFloat (“_Expand",,扩大);   ,,,,,,,,,,,material.SetFloat (“_NoiseIntensity",, NoiseIntensity);   ,,,,,,,,,,,material.SetInt (“_StripeIntensity",, StripeIntensity);   ,,,,,,,,,,,Graphics.Blit(来源、,目的地,材料,,0);   ,,,,,,,}   ,,,}   }

Unity3D如何实现旧电视滤镜阴凉处