上一篇讲了一些常用贴图的用法,这一篇讲下如何使用标准着色器(Standard Shader)的几个渲染模式。
1.标准着色器是什么
首先它是一个着色器(Shader)(狗头,不相当于没说吗),我刚学Unity的时候觉得着色器很高端,会写着色器的人都是大佬,其实不然,弄懂之后也没啥。着色器没什么特别的神秘的地方,它就是一段运行在GPU上代码而已。它和C#一样仅仅是代码,只是两者使用的地方不同,C#用来写游戏的交互逻辑,而着色器用来给物体“上色”。
其次,“标准”是什么东东?这所谓的“标准”有几层意思(如果没学过Shader,以下几点当作了解即可)。
- 它是基于物理的渲染技术(Physically Based Shading, PBS 或者 Physically Based Rendering, PBR)
- 它可以让我们的场景在各种光照条件下(光源的个数、光源类型、光源是否开启阴影以及物体与光源的距离等)都能得到令人满意的效果,同时不需要频繁的调整材质参数
- 它可以让我们不用考虑物体具体是什么材质,如是金属材质还是塑料材质,通通使用同一个着色器来渲染
总结一下,标准着色器其实就是Unity3D官方封装的基于物理的渲染技术的Shader,该Shader在不同光照环境下都能有令人满意的效果,而且能够模拟各种不同的材质。
2.一点准备工作
设置颜色空间为线性空间(Linear)。路径如下:File --> Build Settings --> Player Settings --> Other Settings --> Color Space
这里有个知识:伽马空间(Gamma)和线性空间(Linear)。
伽马空间主要用在移动端、页游、HoloLens,性能比较低的设备上。
线性空间可以得到更加真实的效果,但要求硬件支持线性计算,所以线性空间一般用在PC端和主机端。我们使用标准着色器时,建议使用线性空间,这样可以得到更好的渲染效果。
关于伽马空间和线性空间这里只稍微提了一下,想深入理解的话,参考冯乐乐的文章。
3.四大渲染模式
新建一个材质球,默认的材质就是Standard Shader。(ps: 我使用的Unity版本是Unity2017.4.25,版本不同,标准着色器会有不同)
该Unity版本下,Unity支持了三种基于物理的工作流程:金属工作流、粗糙度工作流和高光反射工作流。这里的工作流程对应于美工制作贴图的工作流程。其实这几种工作流程都可以实现相同的效果,只是它们使用的参数不同而已。
标准着色器支持四大渲染模式。(ps:以下都是使用的Standard Shader)
3.1 Opaque
用于渲染现实世界中一切不透明物体,如陶瓷、塑料、石头、地板等等。
如这里使用该Shader渲染一个蓝紫色的立方体。
3.2 Transparent
用于渲染透明物体,如玻璃。
我们可通过Metallic贴图或Albedo贴图来控制不同区域的透明度,也可通过Albedo中的叠加颜色来控制整体的透明度。如下。
设置不同Alpha的效果,可以看到,我们能透过左边两个透明物体看到后面的不透明物体。(ps:如果手动去写透明物体的Shader的话,需要考虑许多问题,如渲染队列、透明物体的阴影什么的,而在这里我们使用Unity标准着色器,只需调整一点参数就实现好了,这也正是Unity的强大之处)
3.3 Cutout
用于渲染镂空的物体,如中间有洞的纸、被子弹打穿的玻璃等。
这个模式的原理就是设定一个阈值,如果该物体表面上的贴图的Alpha值低于该阈值,就直接把这部分给剔除掉不渲染。
一张贴图导入到Unity会有一个设置面板,需要设置对应的Alpha通道,由于本文用到的贴图自身不带有Alpha通道,所以使用灰度生成Alpha通道,如下。(ps:下次专门讲一下这个设置纹理设置面板)
Shader设置如下。
设置不同Alpha Cutoff效果比较。
3.4 Fadeout
渐隐,可以通过Albedo中的Alpha值来控制物体的显现与消失。和Transparent类似,不同的是Alpha为0时,Fadeout模式的物体完全消失,而Transparent的物体虽然完全透明但仍然能被看见。
项目上传到GitHub了,见06.Rendering-3-StandardShader,下次再会。