Shader2D: 一些2D效果的Shader实现

刚刚开源了自己积累的一些2D效果的Shader实现,项目地址。效果在下面列出,我使用的Unity版本是5.3.5p8,可用不低于此版本的unity打开查看。需要注意的是,我的实现初衷在于原理的理解,并未斟酌优化,如果项目中使用请考虑优化。本文会不定期更新,添加新研究的效果。后面如果有时间,我可能会开一系列博客详细写写每个效果的原理和实现细节,欢迎朋友和我一起讨论。(P.S. 如果对你有帮助,别忘了点github右上角的star,谢谢!)

  • Blur 效果: 模糊 原理: 采样附近上下左右四个相邻像素的颜色,与当前像素颜色按比例混合(简单滤波)

    原图(左) ??????????????????????????????模糊效果图(右)

  • BlurBox 效果: box模糊 原理: 采样周边8个相邻像素的颜色,与当前像素颜色按平均比例混合(Box滤波器)
  • BlurGauss 效果: 高斯模糊 原理: 采样周边8个相邻像素的颜色,与当前像素颜色按比例混合(高斯滤波器)
  • Sharpen 效果: 拉普拉斯锐化 原理: 先将自身与周围的8个象素相减,表示自身与周围象素的差别,再将这个差别加上自身作为新象素的颜色

    原图(左上)、Laplace锐化(右上)、模糊-Box过滤器(左下)、模糊-高斯过滤器(右下)

  • CircleHole 效果: 圆形遮挡过场动画 原理: 圆形遮盖随时间缩小,用于过场动画

  • EarthRotate 效果: 地球旋转动画 原理: 天空盒,UV动画。这个漂亮的实现来自风宇冲的blog

    http://blog.sina.com.cn/lsy835375

  • Emboss 效果: 浮雕 原理: 图像的前景前向凸出背景。把象素和左上方的象素进行求差运算,并加上一个灰度(背景)。

    原图(左)、浮雕效果(右)

  • Pencil 效果: 铅笔画描边 原理: 如果在图像的边缘处,灰度值肯定经过一个跳跃,我们可以计算出这个跳跃,并对这个值进行一些处理,来得到边缘浓黑的描边效果,就像铅笔画一样。

    原图(左)、铅笔画(右)

  • Fade 效果: 渐隐 原理: 根据距离渐隐渐现

  • Flash 效果: 闪光特效 原理: 叠加平行四边形亮光带,随时间运动划过图片,就像一束光带飘过

  • Gray 效果: 灰化 原理: 0.3*R, 0.59*G, 0.11*B

    原图(左)、灰化(右)

  • OldPhoto 效果: 老照片 原理: r = 0.393*r + 0.769*g + 0.189*b; g = 0.349*r + 0.686*g + 0.168*b; b = 0.272*r + 0.534*g + 0.131*b;

    原图(左)、旧照片效果图(右)

  • HexagonClip 效果: 正六边形裁剪 原理:

    原图(左)、正六边形裁剪(右)

  • Mosaic 效果: 马赛克 原理: n x n方块内取同一颜色

    原图(左)、马赛克效果图(右)

  • InnerGlow 效果: 内发光 原理: 采样周边像素alpha取平均值,叠加发光效果
  • OutterGlow 效果: 外发光 原理: 采样周边像素alpha取平均值,给外部加发光效果(1-col.a可避免内部发光)

    内发光、外发光

  • RoundRect 效果: 圆角 原理: 最简单的笨方法,效率差
  • RoundCorner 效果: 同上 原理: 比较巧妙的算法,效率高。详见:

    http://www.cnblogs.com/jqm304775992/p/4987793.html

    原图(左)、圆角1(中)、圆角2(右)

  • Saturation 效果: 调整饱和度 原理: RGB转HSL,增加S再转回RGB

    原图(左)、提高饱和度(右)

  • SectorWarp 效果: 扇形映射 原理: 采样图片上的点,映射到一个扇形区域中

    原图(左)、扇形映射(右)

  • SeqAnimate 效果: 序列帧动画 原理: 从mxn的动画图片中扣出当前帧动作图

  • Shutter 效果: 百叶窗 原理: 划定窗页宽度,2张纹理间隔采样

  • Twirl 效果: 旋转效果 原理: 旋转纹理UV坐标,越靠近中心旋转角度越大,越往外越小
  • TwirlEffect 效果: 旋转效果 原理: 旋转纹理UV坐标。相比上一个,这个没有根据距离调整角度,并且演示了屏幕后处理特效

    原图(左)、旋转(右)

  • Vortex 效果: 旋涡效果 原理: 旋转纹理UV坐标。相比Twirl,离中心越远,旋转角度越大。

    原图(左)、旋涡效果(右)

  • HDR 效果: HDR效果 原理: 让亮的地方更亮,同时为了过渡更平滑柔和,亮度采用高斯模糊后的亮度(灰度值)

    原图(上)、HDR效果(下)

  • WaterColor 效果: 水彩画 原理: 随机采样周围颜色,模拟颜色扩散;然后把RGB由原来的8位量化为更低位,这样颜色的过渡就会显得不那么的平滑,呈现色块效果。

    原图(左)、水彩画效果(右)

  • Wave 效果: 波浪效果 原理: 让顶点的Y轴按正弦或余弦变化。

  • WaterRipple 效果: 水滴波动效果 原理: 正弦波,越远波长越长,振幅越小。

    原图(左)、水滴波动效果(右)


参考

  1. Java Image Filters http://www.jhlabs.com/index.html 一款基于Java的图像处理类库,在图像滤镜特效方面,非常强大,几乎提供了PS上大部分的图像特效,比如反色、扭曲、水波等效果。本文一些效果的算法参考了此项目。
  2. 数字图像处理 随便一本高校用的教材即可。
  3. 其它一些参考已经在具体效果的原理中列出。如有遗漏请指出,谢谢。
时间: 2024-10-08 01:23:23

Shader2D: 一些2D效果的Shader实现的相关文章

UnityShader基础效果-Surface Shader

Ox00 Surface Shader Syntax 常用的三种输出数据格式: //Standard output structure of surface shaders is this: struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission; half Specular; // specular powe

Unity 阴影淡入淡出效果中Shader常量 unity_ShadowFadeCenterAndType和_LightShadowData的问题

由于Universal Render Pipeline目前(2020年4月1日)把阴影淡入淡出这个功能竟然给取消了…我自己拿片元位置到相机位置的距离进行了一个淡化,但是阴影边缘老是被裁切…后来研究了一下Unity里面这个CBuffer是干嘛的.有一些结论,鉴于似乎没搜到,就发个博客吧... 至于这些东西为啥是这样…,我也不知道...反正人家Unity就是这么干的 unity_ShadowFadeCenterAndType决定了阴影消散的中心:xyz保存的是camPos +  normalize(

CSDN日报20170409 ——《扯蛋的密码规则》

[程序人生]扯蛋的密码规则 作者:陆其明 在很多很多关于密码的糟糕事情中,你知道最扯的是什么吗?密码规则! 2015年8月11日,我曾在twitter上说过:"在我的有生之年,如果我们没有帮用户解决密码问题,我死后变成鬼,也要缠着你!" 今日我再提让这句誓言,想让它成为互联网上的永久记录.我不知道是否有来世,但我很快就会知道的,我打算如地狱恶魔般出来游荡-- [图形渲染] <Real-Time Rendering 3rd> 提炼总结(一) --全书知识点总览 作者:毛星云

Unity3D 2D Sprite描边效果Shader,可手动调整效果适配

最近两个月学了很多Shader的知识,现在也算入点门了.现在网上有很多2D描边的Shader,说实话大多数很差劲.有些多余的条件判断影响效率,提供的参数也不够适配所有图片.因为美术喜欢在图片上面加一些效果,再加上切图的时候背景图的透明部分不够多,或者透明通道透明不彻底等等问题,2D图片描边效果通常都不尽如人意.这种情况一般是要从美术那边用ps做调整,如果需要描边切图周围需要留出一点区域,我这个Shader提供了两个参数可以调整效果,检测范围和描边粗细,根据图片的不同,参数肯定要做些调整才能达到最

【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现

笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ------ 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 [Unity Shader](五) ------ 透明效果之半透明效果的实现及原理 [Unity Shader](六) ------ 复杂的光照(上) [Unity

【译】Unity3D Shader 新手教程(2/6) &mdash;&mdash; 积雪Shader

如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的shader 创建一个具有凹凸纹理的shader 为每个像素修改其对应纹理值 在表面着色器中修改模型的顶点数据 引论 这是我们系列教程的第二部分,我们将在此部分实现些有用的技术.在学习完第一部分的所有背景知识后,我们将利用所学的知识实现一个简单的积雪效果的shader.效果如下: 准备工作 我们想做的其实很简单,简单介绍一下: 随着Snow Level(表示积雪的程度,该值越大,积雪

【译】Unity3D Shader 新手教程(1/6)

刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章)详细介绍了Unity3D中的表面着色器(Surface Shader)的,为学习更复杂的Shader编程打下基础. 动机 如果你是刚刚接触Shader编程的新手,你可能不知道从何开始踏出Shader编程的第一步.本教程将带你一步步完成一个表面着色器(Surface Shader)和片段着色器(Fra

Unity3D shader简介

Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包围,它最终绘制3D模型的三角形.如果你想给游戏一个特殊的显示,学习如何编写shader是必要的.Unity3D使用shader做后期处理,对2D游戏也是必不可少的.这个系列的文章将逐步介绍shader编程,并面向几乎没有任何shader知识的开发者. 简介 下图大致表示了在Unity3D渲染流程中发

Unity3d 怪物死亡燃烧掉效果

效果 BurnToFadeOut.shader代码 Shader "BurnToFadeOut" { Properties { _StartColor ("Start Color", Color) = (1,1,1,1) _EndColor ("End Color", Color) = (1,1,1,1) _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}