什么光怪陆离的特效,统统能搞定!
文 / 丁建雄
图 / 董士阳
小白是单纯为兴趣而写作的独立创作人,如果您喜欢小白的文章,欢迎关注、交流、分享(引用请链接到本文)。
特效系统简介
要让游戏画面栩栩如生,单靠模型贴图和光照是不够的。对于有些应用场景,还需要粒子系统、Shader 和 Post Processing 等方法。
一、Shuriken 粒子系统
- 粒子系统是很多游戏引擎都自带的,在unity中被称之为Shuriken(手里剑)。命名的人一定是个狂热的日本动漫迷,因为小白也是从火影忍者中才知道手里剑的,类似于中国的飞镖。
- 粒子系统主要参数包括:发射速率、生命周期、空间范围和单个粒子的外观表现等。
- unity 粒子系统的属性很多,但是基本上可以分为三类:粒子系统主模块、具体属性模块和Shader。
二、Shader 的初步学习
- unity 粒子系统前两个属性主要是对整体效果的优化,Shader则是对单个粒子外观表现的优化。Shader的编码是针对GPU的,用于图形效果渲染,可以极大地改善视觉效果,提升游戏品质。如果说好的3D游戏创新,一部分可以归结为游戏模式,那另一部分游戏品质就是渲染效果了。
- unity 中集成了多种标准Shader,比如石头、木头、玻璃、塑料和金属等材质。所谓材质,其实就是一个或者多个Shader 的组合,用于描述真实世界物体表面的物理属性,通常使用PBS渲染方法。
- Unity 拥有一个标准的Shader,这个Shader 将多种材质模式统一到一个Shader 中,这样就可以通过修改一个标准Shader 从而创造出各种炫酷的效果。同时,由于采用了统一的Shader 标准,不同的材质可以使用统一的光照计算效果,从而得到更真实的渲染体验。
- Shader 的渲染模式:
Opaque 模式,默认设置,用于渲染不透明物体;
Cutout 模式,用于渲染完全透明或者完全不透明物体;
Fade 模式,用于透明度渐变物体的渲染;
Transparent 模式,用于纯透明模式的渲染。 - Shader 的6种贴图:
Albedo:用于定义色彩和透明度
Metallic:用于定于材质表面反射率
Normal Map:法线贴图,用于给物体表面添加刮痕或者凹槽效果,对数学有一定要求,希望深入理解的可以看如下博客:https://www.cnblogs.com/freeblues/p/5742956.html
英文水平不错的建议看原文:https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson6
数学水平可以的,可以参考这位大神的博客:http://acko.net/blog/making-worlds-3-thats-no-moon/
Height Map:用于很大起伏的平面(Normal Map 只是用于描述表面曲率变化从而得到光照模拟效果,而对于大的凹凸和断层,则需要很密集的Normal Map 或者根本无法反映,因此引入了Height Map 作为补充)。
Occlusion Map:用于定义间接光量,具体参考官方文档:
https://docs.unity3d.com/Manual/StandardShaderMaterialParameterOcclusionMap.html
Emission:自发光体的色彩和强度。 - 高分辨率的纹理设定:Secondary Maps
用于定义高分辨率下的图像细节信息,详细参见官方文档:https://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html
同时,main maps 里面的Detail Mask可以用于定义显示高分辨率的区域,从而有选择性地显示高分辨率区域。 - 创建自定义Shader:Shader 可以通过自定义的方式进行创建,通过修改标准Shader 的参数,可以创造定制化的Shader 代码段。
三、Post Processing 后期处理
- HDR (High Dynamic Range) 高动态范围:允许计算机捕捉超出屏幕显示范围的亮度值,这样计算出的画面光场更逼真。
- 计算光场时,需要先将色域转换到linear 色域下(默认为Gama)。Gama 色域是为了弥补人眼对颜色的非线性敏感度而设定的更适合人眼显示习惯的色域,但是这种色域并不适合光场的计算,因此必须先进行转换。具体关于Gama 色域和Linear 色域的讨论可以参见如下博客:
http://www.manew.com/thread-105952-1-1.html - 后期处理特效有很多效果,有时候也不一定就是为了真实,也可以制造出很多特效。
结束语
Unity 特效系统是相当复杂的系统,除了需要专业知识外,更多的需要经验与感觉,还需要有很强的设计情结。其中,对算法要求最高的是Shader 的编程。Shader 的代码编写难度是不大的,关键是要理解设定各种参数背后的数学原理,这部分是有相当高的数学、物理要求的。也只有充分理解了其背后的数学、物理原理,才能在设计的时候变得游刃有余。
当然,对于非常有经验的设计师,充分掌握了设计规律之后,这部分根本不需要从数学物理角度来思考,直接凭感觉就可以了,这就是所谓的直觉。从物理角度来讲是建立了直接的输入 -- 效果输出的对应关系表,而不需要进行中间的过程转化,直接查表就能快速得到结果了,这也是烘焙的原理,哈哈。
既然Shader 如此重要,自然有更专业的第三方插件支持深入的Shader 编辑,比如 Amplify Shader Editor,其作为付费的Assert 插件,自然有更好的用户体验,广受好评。
关于Shader 的使用,有很多专业的书籍去详细探讨,基本可以作为完全独立的课题去研究了,这里就不再展开讨论了。
好啦,这个Shader 花了我两天的时间,不过领略到的魅力却是无穷的。暂时不能继续深入探讨Shader 了,下面要进入 Unity UI 系统的学习。