内容简介:【博物纳新】是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。更多精彩内容请关注:lab.uwa4d.com电视信号受到干扰,产生画面抖动、色彩漂移等现象,这种电子设备成像故障产生的效果,被应用在赛博朋克等科幻类型的影视游戏作品中。逐渐成为一种特有的风格艺术:故障艺术(Glitch Art)。育碧在其3A大作《看门狗》系列中,频繁的采用了
【博物纳新】是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。
更多精彩内容请关注:lab.uwa4d.com
导读
电视信号受到干扰,产生画面抖动、色彩漂移等现象,这种电子设备成像故障产生的效果,被应用在赛博朋克等科幻类型的影视游戏作品中。逐渐成为一种特有的风格艺术:故障艺术(Glitch Art)。育碧在其3A大作《看门狗》系列中,频繁的采用了这种表现手法。日本知名Unity大师Keijiro的开源库项目KinoGlitch模拟了这一风格。
该项目主要模拟了两种类型的效果:Analog Glitch和Digital Glitch。
(无特效时场景)
开源库链接: https://lab.uwa4d.com/lab/5b5d1c86d7f10a201feaa37f
Analog Glitch
这种Glitch效果类型可以分为以下四种效果:
1、Scan Line Jitter
(_scanLineJitter设定为0.5时 效果图)
这种效果是以像素为单位横向拉伸不同程度地拉伸物体,从而形成抖动。可以通过后处理的方式来实现。在Shader中进行采样的时候,采样点为原图位置横向偏移一些的点。可以通过一个float类型的变量来控制偏移量。
(_scanLineJitter设定为1时 效果图)
这个效果的实现重点在于采样的随机性,这样抖动的效果更加逼真。并且偏移量处在一个限定的范围内,即使抖动也能基本看出原本的模型样貌。作者设计了一个较为复杂运算来模拟随机效果,并将偏移量限定在特定范围内:
//AnalogGlitch.cs中设定变量用于控制偏移量 [SerializeField, Range(0, 1)] float _scanLineJitter = 0; //AnalogGlitch.shader //计算具体偏移量 float jitter = nrand(v, _Time.x) * 2 - 1; jitter *= step(_ScanLineJitter.y, abs(jitter)) * _ScanLineJitter.x; float nrand(float x, float y){ return frac(sin(dot(float2(x, y), float2(12.9898, 78.233))) * 43758.5453); } //根据偏移量进行采样 half4 src1 = tex2D(_MainTex, frac(float2(u + jitter, v)));
2、Horizontal Shake
这种效果用于进行横向的抖动,通过设定一个float类型的偏移量。绘制时根据偏移量进行采样即可:
//AnalogGlitch.cs中设定变量用于控制偏移量 _material.SetFloat("_HorizontalShake", _horizontalShake * 0.2f); //AnalogGlitch.shader //计算具体偏移 float shake = (nrand(_Time.x, 2) - 0.5) * _HorizontalShake; float nrand(float x, float y){ return frac(sin(dot(float2(x, y), float2(12.9898, 78.233))) * 43758.5453); //根据偏移量进行采样 half4 src1 = tex2D(_MainTex, frac(float2(u + shake, v)));
3、Color Drift
(效果图)
这种效果主要用于模拟机器故障时颜色显示出现错乱、偏移、重影的情况。可以通过讲RGB通道进行分离重组的方式进行实现。
//AnalogGlitch.cs中设定变量用于控制偏移量 var cd = new Vector2(_colorDrift * 0.04f, Time.time * 606.11f); _material.SetVector("_ColorDrift", cd); //AnalogGlitch.shader //计算具体偏移 float drift = sin(jump + _ColorDrift.y) * _ColorDrift.x; //采样原图&根据偏移量进行采样 half4 src1 = tex2D(_MainTex, frac(float2(u , v))); half4 src2 = tex2D(_MainTex, frac(float2(u + drift, v))); //将上述的采样结果进行混合 return half4(src1.r, src2.g, src1.b, 1);
4、Vertical Jump
(效果图)
这种效果用于模拟机器故障时,出现纵向跳动的的情况。这种情况的模拟比较简单,可以通过设定一个纵向偏移量,对原图进行采样即可:
(效果图)
在此基础上,可以通过插值,来实现采样过程中只采集局部图片的效果:
(进行插值后效果图)
具体代码如下:
//AnalogGlitch.cs中设定变量用于控制偏移量 _verticalJumpTime += Time.deltaTime * _verticalJump * 11.3f; var vj = new Vector2(_verticalJump, _verticalJumpTime); _material.SetVector("_VerticalJump", vj); //AnalogGlitch.shader //进行插值 float jump = lerp(v, frac(v + _VerticalJump.y), _VerticalJump.x); //根据偏移量进行采样 half4 src1 = tex2D(_MainTex, frac(float2(u, jump)));
可以将上述四种实现效果进行组合:
half4 src1 = tex2D(_MainTex, frac(float2(u + jitter + shake, jump))); half4 src2 = tex2D(_MainTex, frac(float2(u + jitter + shake + drift, jump))); return half4(src1.r, src2.g, src1.b, 1);
从而得到一些复杂的效果:
(效果图)
Digital Glitch: Block Damage
(效果图)
这种类型效果是在图像上显示一定大小、颜色的色块,用于模拟电子设备故障部分区域无法正常显示的效果。
可以通过一个噪声图像来辅助制作。首先随机生成一个噪声图像:
void UpdateNoiseTexture(){ var color = RandomColor(); for (var y = 0; y < _noiseTexture.height; y++){ for (var x = 0; x < _noiseTexture.width; x++){ if (Random.value > 0.89f) color = RandomColor(); _noiseTexture.SetPixel(x, y, color); } } _noiseTexture.Apply(); }
设定一个float类型的变量_intensity用来控制效果力度。
作者在片元着色器中设计了一套运算,保证当_intensity=1时,图像全部区域产生该效果:
反之,_intensity=0时,没有效果。
具体采样包括:正常图像、前一次刷新时图像、噪声图像。通过这三种图像采集的得到的区域进行混合叠加得到效果:
性能测评
我们对项目进行优化处理,将场景中模型使用的Standard Shader 全部替换为Diffuse Shader。(大家在使用案例测试时要注意其Standard Shader带来的巨大开销)。
使用华为8Plus,开启多线程渲染,同时开启两个效果后,用GOT Online测试了下性能,FPS可达30帧左右。
读者可以尝试将该效果应用于移动端。应用时可以进一步优化,例如简化算法,减少使用sin、dot、pow等函数,采用其他的算法来模拟随机等。
今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......
请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Series 60 应用程序开发
巴克 / 人民邮电出版社 / 2005-7 / 75.0
Series 60智能手机开发平台正掀起新一轮的移动服务浪潮。超过60%的手机生产商获得了Series 60平台的授权。Series 60移动应用开发平台拥有最大的用户群,从而成为智能手机市场的代表。诺基亚与EMCC软件公司合作,为C++程序员和软件设计师编撰了这本Series 60开发的权威指南。本书由诺基亚资深专家进行了全面审阅。本书内容涉及了开发过程的各个阶段,从设计、编程、测试、调试到部署......一起来看看 《Series 60 应用程序开发》 这本书的介绍吧!