程序纹理小结

来源:互联网 发布:淘宝在哪里评价 编辑:程序博客网 时间:2024/06/15 20:19

   程序纹理(Procedural texture)在国外研究得比较早目前发展也比较靠前,然而国内在这块的研究却还是非常有限,甚至我在搜索引擎上都找不到程序纹理的词条,相关的资料也是非常之缺乏,而且大多是为了解决应用问题,真正吃透原理并加以改进的资料更罕见,这也是我写本系列的初衷,希望后来之人能在我的基础上做些更深入的基础研究,而不仅仅是知其然。

一、程序纹理

   在计算机图形学中,程序纹理通常是指使用数学描述的方式来生成的纹理。与之相较的纹理则可称为数据纹理,数据纹理是直接存储的纹理数据。在程序纹理之前,当有人提及纹理时,通常是指的数据纹理(为避免理解混乱,以下我们将通常说的纹理称为数据纹理以区分程序纹理),给我们的印象也通常是使用一张图来给一个模型赋予外观,也就是纹理映射,通过模型位置对纹理进行一个个的采样而将图“覆盖”到模型表面从而使模型有真实的外观表现。但这种方式只是一种欺骗眼睛的伎俩,一是物体不会因为一张图而变得丰满(实体),也不会呈现如真实物体应有的特质而会出现模糊、变形、失真;二是数据纹理是静态的,不会真实的反映物体的动态变化。因此,他只是在现阶段计算容量有限的情况下对客观现象的一种无奈的妥协。程序纹理则采用完全不同的方法,他不是创建一个图像、不是定义像素块,因此他完全没有失真的概念,他允许你在任何尺度上、在任何方向上创建纹理,允许你无限的扩展而不会出现中断或者不连续,而且他不用你存储大量的纹理数据,占用大量的内存资源。程序纹理几乎可以生成你想要的所有基础纹理(只要你有足够的耐心),substance painter软件就是完全使用程序的方式来生成照片级的纹理。

(一)、程序纹理的优缺点

   程序纹理有很多优点,概括起来:
   1、程序纹理可以生无限细节和尺度的纹理。在数据纹理中,我们往往要使用类似插值、LOD之类的技术来优化处理,但程序纹理利用分形技术,可以得到无限细节的纹理,所以在程序纹理中,不会出现失真、模糊之类的问题。还可以生成无限尺度的纹理,不管你的物体有多大,地形有多广,程序纹理总能够精确的满足你的需要,你不用担心纹理边界的处理问题。
   2、程序纹理不占用内存。他不需要你提前准备大量的纹理资源,大大减小应用或者游戏的包体积。我们甚至不需要占用CPU的计算资源,而将运算迁移到GPU中去,利用GPU强大的计算能力并行的解决纹理生成问题。
   3、程序纹理可以生成任意维度的纹理。这是数据纹理无法比拟的优势,数据纹理维度都是有限的,当前获取高维度的数据纹理还面临不少问题,但程序纹理可以轻松解决这个问题,程序纹理可以轻而易举的生成任意维度的纹理,真正让渲染的物体有血有肉而不是只有一张空皮。
   4、程序纹理可以逼真的模拟大自然。程序纹理提供了一种了解大自然的窗口,我们可以通过他看到自然现象里的数学本质,他可以生成毫无人工痕迹的自然景观和纹理表现,结合PBR(Physically-Based Rendering)技术,将更进一步的提高计算机模拟的质量和效果。
   程序纹理还有很多其他优点,如多变性,他能够通过简单的调节参数而生成风格迥异的纹理;无缝平铺性,生成完全平铺的纹理等等,可以预见,随着硬件计算力的提升,程序纹理必将受到愈来愈多的关注。当然,程序纹理也并非万能,他有他的不足,首先他是计算密集型的算法,对硬件有较高的要求,特别是过多过滥的使用会严重影响应用或者游戏的性能;其次,程序纹理现阶段还无法描述复杂纹理;再次程序纹理对程序编写人员要求较高,因为他是使用数学公式来描述纹理,因此要求一定的数学基础。

(二)、噪声算法与程序纹理

   程序纹理泛指利用算法生成的纹理,噪声算法只是程序纹理中的基础算法,例如,还可以利用程序纹理生成树、生成地形、甚至生成照片级景观等等。但噪声算法又是程序纹理中最基础的算法,在这个基础之上,可以实现对很多物体或者自然景观的模拟,在我们前面的学习中,我们学习了Value噪声、Perlin噪声、Simplex噪声、Worley噪声、Voronoi噪声,这些噪声算法是当前图形学中用得非常之多的算法,对这些算法的改进算法也是层出不穷,利用这些基础算法可以模拟云、雾、烟、火、水等各类自然非规则动态现象。因此,噪声算法是图形学中最基础的程序纹理算法,掌握这些算法有利于我们更好的理解高级程序模拟。
   就像我们之前所说,程序纹理有很多优势,在计算机计算能力愈来愈强的将来,程序纹理必将与体渲染一道成为下一代图形学的热点,程序纹理的固有特点使得他不用处理LOD、纹理压缩、Mipmap之类的问题,在体渲染中为物体提供实实在在的Voxel。

二、噪声库

(一)、libnoise

   A portable, open-source, coherent noise-generating library for C++。
   libnoise是一个可移植的C++库,用于生成平滑噪声。libnoise可以生成Perlin噪声(包括分形噪声),和其他类型的噪声。在libnoise中,噪声生成模块被封装在噪声发生器中,可以生成多种类型的噪声,有些噪声模块可以以多种方式组合或修改其他噪声模块的输出,可以将这些模块结合在一起,产生非常复杂的噪声。
   libnoise官网地址:http://libnoise.sourceforge.net/

(二)、CoherentNoise

   coherentnoise是一种产生噪声的综合库,它的灵感来自libnoise C++库。coherentnoise可以产生多种噪声类型,包括柏林,分形噪声和Voronoi图。他可以用直观的方式修改和组合噪声函数,从而实现更多的组合,可以创建超过30个不同的组合,修改和组合噪音都比较容易,扩展性好。
   coherentnoise使用手册, http://chaoscultgames.com/products/CN/CoherentNoiseManual.pdf
   开源代码:coherentnoise

(三)、FastNoise

   FastNoise是一个开源的为实时使用而设计的噪声库,FastNoise在LibNoise上进行了优化,能在牺牲噪声质量的同时对噪声生成进行加速。Fastnoise 目前有多个语言的版本,包括C++,C#,java,甚至包括一个SIMD的C++版本,以期利用SIMD指令获得得性能提升。
   FastNoise开源地址:https://github.com/Auburns/FastNoise

(四)、Voro++

   Voro++ 是一个为执行3D Voronoi细分的C++库,他主要用于3D晶胞的Voronoi计算,是一个专用库,用于Voronoi分析与拆分。
   Voro++ 地址:http://math.lbl.gov/voro++/

(五)、SharpNoise

   SharpNoise是一个用于 JavaScript、 C# 、 C++的噪声库,提供以下噪声的生成算法:Perlin、Simplex、 Wavelet、Worely,有较好的跨平台特性。
  SharpNoise地址:https://sharpnoise.codeplex.com/

(六)、Pynoise

  Pynoise是一个用python写的噪声库,可以产生多种类型的噪声。
  Pynoise地址:https://pypi.python.org/pypi/pynoise/2.0.0a0

(七)、CgFx/HLSLnoise

  CgFx/HLSLnoise是一个用cg写的shader端噪声库,基于WebGL重写的可适用于unity的CgFx/HLSL,作者对WebGL代码进行了些优化(不过,代码中仍然有可优化的空间),支持2D、3D 、4D噪声生成。
  CgFx/HLSLnoise地址:https://forum.unity.com/attachments/noise-simplex-7z.79202/

参考文献

1、Procedural texture Procedural texture
2、Introduction to Procedural texture Introduction to Procedural texture