UnityShader入门精要第十一章-让画面动起来原理总结
前言
十一章之前的章节讨论了如何处理更复杂的光照、折射与反射和程序化生成材质等内容。第十一章讨论的是如何利用Shader
让画面动起来,这章内容能轻松解决自己开发时遇到的某些问题,特此记录一下。
纹理动画
常见的纹理动画一般有两种:序列帧动画和背景滚动。
序列帧动画
这个没什么好说的,和Unity
自带的序列帧动画如出一辙。
但在Shader
中裁剪子图像时要注意:Unity
中纹理坐标竖直方向的顺序(从下到上逐渐增大)和序列帧纹理中的顺序(播放顺序是从上到下)是相反的。
我个人用起来,感觉不如Unity
自带的动画系统。
背景滚动
思路很简单:根据时间对纹理坐标进行偏移。
如果要做2D
的景深,可以分别设置两张纹理及其偏移速度,在顶点着色器中按偏移速度分别采样,再在片元着色器中混合即可。
顶点动画
纹理动画是在纹理采样上做偏移;顶点动画则是切实改变了模型顶点的位置。对顶点的操作要在顶点着色器中完成。
流动
常见的有水流、旗帜等等,可以在顶点着色器中使用三角函数来实现。
书中举的例子是水流,在模型空间的x
轴方向上应用了sin
函数,从而实现水流上下起伏的效果;同时也用了纹理动画,按时间对纹理坐标进行偏移,看起来水在流动。
广告牌
广告牌效果意味着对应模型总是正对着摄像机。
这个效果稍复杂,但本质都是构建旋转矩阵,如文中所述。
广告牌技术的本质就是构建旋转矩阵,而我们知道一个变换矩阵需要三个基向量。广告牌技术使用的基向量通常是表面法线 (normal) 、指向上的方向 (up) 和指向右的方向 (right)。 除此之外,我们还需要指定一个锚点 (anchor location),这个锚点在旋转过程中是固定不变的, 以此来确定多边形在空间中的位置。
......
广告牌技术的难点在于,如何根据需求来构建三个相互正交的基向量。计算过程通常是,首先通过初始计算得到目标的表面法线(例如就是视角方向)和指向上的方向 ,而两者往往是不垂直的。但两者其中之一是固定的,例如模拟草丛时,我们希望广告牌的指向上的方向永远
(0, 1, 0)
, 而法线方向应该随视角变化;而模拟粒子效果时,我们希望广告牌的法线方向是固定的,即总是指向视角方向,而指向上的方向则可以发生变化。
注意
- 由于顶点动画要在模型空间下修改各自顶点,所以要注意
Shader
中要设置关闭批处理,批处理会导致各自的模型空间丢失。 - 如果想要对应用了顶点动画的物体添加阴影,则要提供一个自定义的
ShadowCaster Pass
。在这个Pass
中进行同样的顶点变换过程。