这一节讲一下着色器Shader中的Vertex Shader顶点着色器。
着色器Shader
着色器shader是一个在渲染中很常见的概念,可以这样简单的认为:着色器的代码,它的功能就是输入一组数据,使用它运算后,输出另一组数据。
着色器shaders的分类有许多:顶点着色器Vertex Shader、像素着色器Pixel Shader、片段着色器Fragment Shader、域着色器Domain Shder等。
着色器非常高效,我们之所以使用着色器系统,是因为我们的硬件没有足够的运算能力,例如你没办法把它单纯的交给GPU架构或CPU架构来运算处理。所以就设计出了一个着色器系统,专门用来处理大量的简单运算,并且通常是并行运算。
顶点着色器Vertex Shader(首个着色器)
顶点着色器有三个用途:
1、将本地坐标的顶点位置,转换为世界坐标中的位置
比如有一个立方体,以中心为三维空间原点,那么它的8个顶点以边长的一半,都可以被表示出来,那么这个表示方式,就是该模型保存的本地坐标的顶点位置。
当把他放在世界中,它的8个顶点的位置,会相对世界的原点而计算新的位置,这个位置就是世界坐标中的位置。
而顶点着色器,就是将模型本地顶点位置,根据其在世界坐标系中的具体位置,转换成世界坐标位置。
2、顶点着色器会处理平滑过渡、硬边缘、柔化边缘以及顶点的颜色。
3、能够应用偏移
既然可以将本地坐标的顶点位置,转换为世界坐标中的位置,那么就可以进行位置偏移,无论是转换后偏移,还是转换前偏移。这种偏移处理,属于渲染出来的效果,与实际物体的位置有差异。比如当把物体通过顶点着色器沿着Z方向偏移很远,实际看起来的效果确实沿着Z方向偏移了很远,但其原来位置仍有它的实体存在,碰撞盒就在原来的位置没变,可以进行物理碰撞等动作。也就是说CPU并不知道顶点着色器渲染出的物体进行了偏移。如图:
这种技术,可以应用于水波纹、布料自然褶皱、植被摇晃草地自然飘动、旗帜的自然飘动等效果,如图:
该图中的草,只周期性的改变了顶端顶点的位置,而没有改变地面顶点位置。
我们可以用这种效果来代替动画,我们不可能为这一大片草地的每一株草设置动画,使用草的骨骼和骨架,上百万个顶点的每一帧的骨骼和骨架的实时位置,那将是一个极其消耗性能的行为。
顶点着色器可以这样做,因为他们进行过优化处理。要记住的是,我们不能使用顶点着色器的这一功能,来实现十分重要的物理效果,它只能用于视觉效果。
需要注意的几个点:
1、动画越复杂,效率就会越低下。
2、模型点数越多,效率就会越低下。
3、高面数对象,应该使用更简单的顶点着色器。
4、禁用远距离世界坐标偏移:意思就是当我们与正在使用顶点着色器渲染动画的对象相隔一定距离时,我们应该禁用掉它的顶点着色器中坐标偏移的功能,也就是动画功能,这可以让性能好一些。(实际上,动画、特效和偏移都应该如此处理)