Shader学习:特效和程式生成

1. 闲聊这两周做了什么

  • 项目
    最近两周感觉我们的项目“极”的进度还不错,但是我新写的代码量不多,主要是美术方面的进度比较多。
    我们打算给每个BOSS一个AI,现在正在写第二关BOSS的AI。上次团队大会,我们承诺 12.24 号的时候出第一版Demo,其实就是三个完整的关卡。感觉这个星期写完实验后需要肝了,不然搞不定呀。

  • Shader学习
    感觉自己也不能总是写写逻辑什么的,正好最近需要写写特效,所以开始学习各种Shader的编写。同时,为了在周末的组会上分享一点新的东西,同时也为了能给我们的极写写特效,我开始学习起了程式生成的Shader编写。

  • 游戏
    游戏的话,这两周玩的时间不多,通关了《堡垒》,感觉挺棒的,下次有时间的单独写一篇文章来聊聊这个游戏。

  • 课业
    课业仍然非常可怕。主要是华科有各种各样的实验报告,可怕可怕。我的计网实验报告还没开始写呢,大后天交,好害怕…….
    我们最近还考了C++,C++还是挺难的呀。考试考得我对C++都没有信心了…….几乎裸考,不知道结果如何…….
    还有英语六级考试是昨天考完的,裸考。不行呀,下次要好好准备了!
    要开始好好学习了!

2. 特效展示

2.1 护盾特效:

  • 这个特效的边缘高亮是用 Fresnel 做的。
  • 中间的机体模糊是用的高斯模糊做的。
  • 六边形的隐约的轮廓是用的贴图。

2.2 光圈扩散效果:

这个图显然是网上随便找的图……

  • 光彩流过的效果,是第二张图,根据第一张图的亮度进行叠加 –
  • 亮度为0的地方不叠加,亮度为1的地方叠加程度最大。
  • 消隐效果是通过参数,控制半径为圆的透明度平滑变化,这样就消隐了。

2.3 屏幕扭曲

屏幕扭曲的话,这个是用了后处理。

  • 首先将这个屏幕用一个 GrabPass 抓下来,然后在一个圆环上进行扭曲,其他地方不变。
  • 然后用脚本控制扭曲区域的圆心,和半径变化,这样最终形成这样的效果。

2.4 半兰伯特消隐 + 护盾

  • 可以看到,这个特效结合了之前的护盾特效,只不过加入了消隐效果。
  • 这个消隐效果其实是使用了半兰伯特光照模型,对护盾的 Alpha 值进行处理,然后,光照强的地方 Alpha 接近1,光照弱的地方 Alpha 值接近 0。用脚本控制光照角度不停地变化,就可以实现这种效果了。

3. 程式生成 Shader

ShaderToy 是我很早以前就知道的一个写 fragment shader 的网站了。不过以前是因为完全不懂程式生成的 Shader 应该怎么写,所以并看不懂 ShaderToy 里面的各种很好看的 Shader 实现的方法。

直到最近我找到了这本 Fragment Shader 的教程:The Book of Shaders。这本书里详细的告诉了你怎么从一个最简单的几何图形,一步一步画出好看的图形。

我不打算讲其中的原理,原理真正想学的话,可以看看这本书,里面都有,我主要在这里展示一下我目前的学习成果。

以下展示的所有 shader 效果,都没有用到任何材质什么的东西,全部都是代码写 Fragment Shader 写出来的。

3.1 造型函数 + 移动 相关Shader

这里的 Shader 主要是展示不同的形状如何用函数写出,并且在屏幕上表现出来。比如各种函数曲线啦,圆啦,长方形啦,之类的。

造型函数是程式生成的基础,脚手架。

这里有许许多多的造型函数的函数表达式:造型函数进阶

3.2 颜色

关于颜色的 Shader 主要是展示许许多多的不同颜色混合的效果,以及 HSB 和 RGB 空间的相互转化的效果。颜色可以通过不同的造型函数进行混合以产生有趣的效果。

3.3 图案

以下引自 Patricio Gonzalez Vivo & Jen Lowe

制作程序图案就像是种寻找最小可重复元素的古老练习(灵修)。我们长时间使用网格和图案来装饰织物、地面和物品的镶边物种:从古希腊的弯曲图案,到中国的窗栅设计,重复和变化的愉悦吸引我们的想象。

Franz Sales Meyer - A handbook of ornament (1920)

3.4 噪声

噪声真是一种很神奇的东西,它可以生成很多很多精美的图案,下面展示的东西大多是我从网上学习后编写的很基础的噪声函数生成图。

它们包括了:随机模拟、噪声模拟、分形布朗运动。

以后还要学习更多噪声相关的东西呢 – 不过接下来几天先把实验报告搞定吧…….

3.5 其他 blabla

学习了一些程序生成的相关知识后,我也能够慢慢理解 ShaderToy 里的相关代码了,以后在需要用到一些特效的时候也能够在 ShaderToy 上借鉴借鉴,然后移植到 Unity 中来了 :)