【Unity Shader入门精要】— 中级篇

内容会持续更新,有错误的地方欢迎指正,谢谢!

引言

本书还有中级篇、高级篇、扩展篇,这篇文章我们来说说中级篇。考虑到内容较多,我在中级篇、高级篇、扩展篇博客里只列一些提纲和我自己的一些总结、领悟,具体实现方法,希望各位看客,购买乐乐女神的书,好好琢磨研究~

更复杂的光照

Unity的渲染路径

Unity的渲染路径可以是:

  1. 前向渲染路径
    前向渲染路径有两种常用的处理光照(即照亮物体)的方式:逐顶点处理,逐像素处理。最常用。
  2. 延迟渲染路径
    延迟渲染主要包含了两个Pass。在第一个Pass中,仅仅计算哪些片元是可见的。然后,在第二个Pass中,我们进行真正的光照计算。
  3. 顶点照明渲染路径
    配置要求低,效果最差,不支持逐像素操作,也就是只使用了逐顶点的方法来计算光照,是前向渲染路径的一个子集。

Unity默认使用前向渲染路径,指定渲染路径是我们和Unity的底层渲染引擎的一次重要的沟通。例如,如果我们为一个Pass设置了前向渲染路径的标签,相当于告诉Unity:“我准备使用前向渲染了,你把那些光照属性都按前向渲染的流程给我准备好,我一会儿要用!”随后,我们可以通过Unity提供的内置光照变量来访问这些属性。

Unity的光源类型

  1. 平行光
  2. 点光源
  3. 聚光灯

最常用的光源属性:位置、方向、颜色、强度和衰减。

这里写图片描述
平行光为绿色,再逐个增加黄色的点光源的效果。

Unity的光照衰减

利用纹理查找的方式在片元着色器中计算逐像素光照的衰减,好处:不依赖于数学公式的复杂性,只需要一个参数值去纹理采样即可,在一定程度上提升了性能。而且得到的效果在大部分情况下都是良好的,因此Unity默认就是使用这种纹理查找的方式来计算逐像素的点光源和聚光灯的衰减的。

Unity的阴影

在实时渲染中,我们最常用的是一种名为Shadow Map 的技术。这种技术很简单,它会首先把摄像机位置放在与光源重合的位置上,那么场景中该光源的阴影区域就是摄像机看不到的地方。而Unity就是使用这种技术。

这里写图片描述
使用Shadow Map技术实现的阴影效果。

补充

由纹理查找图有感:需要复杂计算的地方,用查找表/图来替代。
例如:sin计算,最简单的方法就是把其所有值的结果通过数组保存起来。

高级纹理

立方体纹理

立方体纹理包含6张图像,这些图像对应了一个立方体的6个面。使用立方体纹理的好处在于,它的实现简单快速,而且得到的效果也比较好。但它有一些缺点,例如当场景中引入了新的物体,光源,或者物体发生移动时,我们就需要重新生成立方体纹理。除此以外,立方体纹理也仅可以反射环境,但不能反射使用了该立方体纹理的物体本身。

立方体纹理在实时渲染中有很多应用,最常见的是用于天空盒子以及环境映射。

这里写图片描述
使用脚本渲染立方体纹理

渲染纹理

在Unity中使用渲染纹理通常有两种方式:一种方式是在Project 目录下创建一个渲染纹理,然后把某个摄像机的渲染目标设置成该渲染纹理,这样一来该摄像机的渲染结果就会实时更新到渲染纹理中,而不会显示在屏幕上。使用这种方法,我们还可以选择渲染纹理的分辨率、滤波模式等纹理属性。另一种方式是在屏幕后处理时使用GrabPass命令或OnRederImage函数来获取当前屏幕图像,Unity会把这个屏幕图像放到一张和屏幕分辨率等同的渲染纹理中,下面我们可以在自定义的Pass中把它们当成普通的纹理来处理,从而实现各种屏幕特效。

可以实现镜子、玻璃等效果。另外,从效率上来讲,渲染纹理的效率往往高于GrabPass,尤其在移动设备上。

这里写图片描述
镜子

这里写图片描述
玻璃

程序纹理

用C#代码实现的、计算机生成的图像。好处在于我们可以使用各种参数来控制纹理的外观,多变性超强。

这里写图片描述
实现的程序纹理

让画面动起来

Unity Shader内置的时间变量_Time

动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可随之变化。

纹理动画

在移动平台上,我们往往用纹理动画来代替复杂的粒子系统等动画效果。

顶点动画

也就是在顶点着色器中修改顶点,形成动态效果。