《花纹算法》

144 阅读2分钟

自制的硬件加速的花纹算法\

把今天技术分享时用的ppt展示一下。

花纹算法的核心作用是不需要网格体的UV坐标就可以体面地贴各种花纹。三个实现算法中,前两个都是教学用的,用于理解,正真有实战价值的是第三种通用的花纹算法,下面我们来一一讲解一下。首先区分2个概念:图案与花纹。

左边的是图案,不可分割,因为分割后图案所表达的含义受损。右边的是花纹,可以分割。

最直观的方法是使用投影,使用虚幻引擎中的贴花(decal),把基础图元平移复制个几十份,投影到特定的欧氏空间,空间内的所有表面都可以享受到花纹的覆盖。\

但是贴花投影的缺点在于,一个贴花只能投影一个面,而且占用1个actor,需要许多cpu的计算,如果能把这些计算任务转移到gpu身上,性能会提升很多。所以接下来我们讨论一下花纹算法在shader上的实现。

定向的花纹算法其实效果和贴花差不多,就是X、Y、Z三个定向,将UV平面分别映射到XY平面、XZ平面、YZ平面,再加之以旋转和缩放从而得出花纹。

但是现实情况很少只有xyz三个方向的网格体,如何写一个通用的shader,让各个方向的三角面都能沐浴到花纹呢?这就需要用到法线了。\

好在标准库提供了RotateVector函数,专门用来旋转向量,它接收3个float3对象,分别是被旋转的点、旋转的开始向量和终点向量。我们的目标是将Z轴旋转至W轴,角度θ由2个向量计算得出。

花纹算法的核心思想:坐标轴的旋转。这里有2个坐标系:世界坐标系XYZ和纹理空间UVW(W垂直于UV平面)。其中Z轴的向量是(0,0,1),W轴的向量是就是图中的PixelNormalWS,即每个像素所在三角面的法线。\

完整代码(支持旋转和缩放):

效果: