Chapter 6 – Texturing 贴图

6.3 程序化贴图(Procedural Texturing)

基于贴图空间的坐标,进行图像查询是一种生成贴图值的方法。另一种则是通过函数来生成贴图值,而这一种方法被成为程序化贴图。

程序化贴图常用于离线渲染的应用中,而图像贴图常用于实时渲染。这是因为现代的GPU能够高效地进行图像贴图,其能够在一秒内处理数十亿的贴图。然而,GPU的架构正向着计算开销越来小,而相对的内存读取的开销越来越大的方向进化。这些趋势使得程序化贴图在实时渲染的应用中逐渐发挥更大的作用。

体积贴图对于程序化贴图技术来说是非常有吸引力的。最为常用的方法是使用一个或者多个噪点函数来生成贴图值。噪点函数通常以连续的2次幂的频率进行采样,其被成为octaves。每一个octave都带有一个权重,通常随着频率的增加而降低,这些权重的总和被成为turbulence函数。

由于执行噪点函数的开销,三维数组中的阵点通常是预计算的,且被用于对贴图值进行插值。我们有不同的方法来使用color buffer进行融合(blend)以快速地生成这些数组。Perlin提出了一种快速采样噪点函数的方法。Olano则提供了噪点生成算法,其支持存储贴图与实现计算之间的平衡。McEwan提出了在着色器中可以实现的计算经典噪点与单一噪点的方法,其不需要进行任何查询。

还有其他的程序化贴图类型。例如,通过计算每一个坐标点到一组“特定点”的距离形成cellular texture(蜂窝状贴图)。将计算出的最近距离以不同的方式进行映射能够生成类似于细胞,石板,皮肤和其他类型的贴图。Griffiths则提出了如何在GPU端高效地生成cellular贴图。

另一种类型的程序化贴图则是物理模拟或者其他交互过程的结果,例如,水泡或者裂痕等等。这一类贴图可以基于不同的条件高效地生成各种不同的效果。

当我们创建一张二维的程序化贴图时,参数问题(贴图坐标)会造成更多的困难,我们需要手动去修正贴图中的拉伸或者接缝。一个解决办法是完全避免参数,直接将贴图同步到物体表面。在复杂的物体表面实现这一操作是非常困难的,这也是当今研究的一个方向。

对程序化贴图进行抗锯齿比对图像贴图进行抗锯齿,更为困难,但也更为简单。一方面来说,一些预计算的方法,例如mipmapping,对于程序化贴图不再试用,这无疑增加了程序员的工作量。另一方面来说,程序化贴图让程序员能够更好的控制贴图的内容,所以我们也有更多的选择来避免锯齿问题,尤其是对于那些通过噪点函数的累加所生成的贴图。每一个噪点函数的频率都是已知的,任何可能造成锯齿的早点函数可以提前被禁用,这也能降低程序化贴图的计算开销。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据