UnityShader入门精要第十一章-让画面动起来原理总结

发布时间 2023-10-30 22:33:10作者: AshScops

前言

十一章之前的章节讨论了如何处理更复杂的光照、折射与反射和程序化生成材质等内容。第十一章讨论的是如何利用Shader让画面动起来,这章内容能轻松解决自己开发时遇到的某些问题,特此记录一下。

纹理动画

常见的纹理动画一般有两种:序列帧动画和背景滚动。

序列帧动画

这个没什么好说的,和Unity自带的序列帧动画如出一辙。

但在Shader中裁剪子图像时要注意:Unity中纹理坐标竖直方向的顺序(从下到上逐渐增大)和序列帧纹理中的顺序(播放顺序是从上到下)是相反的。

我个人用起来,感觉不如Unity自带的动画系统。

背景滚动

思路很简单:根据时间对纹理坐标进行偏移。

如果要做2D的景深,可以分别设置两张纹理及其偏移速度,在顶点着色器中按偏移速度分别采样,再在片元着色器中混合即可。

顶点动画

纹理动画是在纹理采样上做偏移;顶点动画则是切实改变了模型顶点的位置。对顶点的操作要在顶点着色器中完成。

流动

常见的有水流、旗帜等等,可以在顶点着色器中使用三角函数来实现。

书中举的例子是水流,在模型空间的x轴方向上应用了sin函数,从而实现水流上下起伏的效果;同时也用了纹理动画,按时间对纹理坐标进行偏移,看起来水在流动。

广告牌

广告牌效果意味着对应模型总是正对着摄像机。

这个效果稍复杂,但本质都是构建旋转矩阵,如文中所述。

广告牌技术的本质就是构建旋转矩阵,而我们知道一个变换矩阵需要三个基向量。广告牌技术使用的基向量通常是表面法线 (normal) 、指向上的方向 (up) 和指向右的方向 (right)。 除此之外,我们还需要指定一个锚点 (anchor location),这个锚点在旋转过程中是固定不变的, 以此来确定多边形在空间中的位置。

......

广告牌技术的难点在于,如何根据需求来构建三个相互正交的基向量。计算过程通常是,首先通过初始计算得到目标的表面法线(例如就是视角方向)和指向上的方向 ,而两者往往是不垂直的。但两者其中之一是固定的,例如模拟草丛时,我们希望广告牌的指向上的方向永远 (0, 1, 0), 而法线方向应该随视角变化;而模拟粒子效果时,我们希望广告牌的法线方向是固定的,即总是指向视角方向,而指向上的方向则可以发生变化。

注意

  1. 由于顶点动画要在模型空间下修改各自顶点,所以要注意Shader 中要设置关闭批处理,批处理会导致各自的模型空间丢失。
  2. 如果想要对应用了顶点动画的物体添加阴影,则要提供一个自定义的 ShadowCaster Pass。在这个Pass中进行同样的顶点变换过程。