程序纹理应用之静态纹理生成

  自然界的自然现象均是连续的,如山脉、花纹、烟雾、流水;自然界又是分形的,宏观与微观具有几何相似性;自然界的自然现象还具有流畅的变化特征。用传统的图形学来描绘一些自然现象,如火焰、流水、烟雾,存在很大的难度,一方面是需要大量的纹理,另一方面还需要复杂的运算,导致模拟得不像不真。而利用噪声函数来模拟却可以很好的达到效果,甚至是用粒子系统也无法达到的效果。目前使用得最广的是粒子系统,还有细胞自动机和基于物理的建模方法,一些方法适用于静态模拟如基于于物理的方法,一些适合动态模拟如粒子系统。也各有优劣,粒子系统困难在于粒子运动规律的数学建模,物理建模困难在于参数的获取和调整等等。
  前面我们提到过程序纹理的优点,本文我们主要采用噪声和分形的方法来生成静态纹理。

一、静态纹理生成方法

  Turbulence(湍流、脉流),也称为紊流,是流体的一种流动状态。此前我们学习过用Perlin噪声生成turbulence,Turbulence由于其特性在我们模拟很多其他纹理的时候也很常用,使用Turbulence,可以连续、自然的过渡。因此在模拟中我们很多时候都会用到Turbulence,或者将其用作中间的一个步骤。另外,在图形学中,很多值或者参数的选择具有经验性,因此需要反复调整参数才能达到想要的效果。

(一)颜色映射

  在前面的学习中,我们知道我们的噪声函数返回值范围为[-1,1],而128位颜色值的取值范围为[0,1],因此我们需要对噪声函数返回值做一个映射,最简易的就是:  y=0.5x+0.5 ,这样将噪声值映射到了颜色空间,就可以显示出颜色了,之前我们一直也是采用这种办法来可视化噪声结果。通过这个映射,我们的噪声值到颜色值是全域映射的,也就是噪声值理论上是可以覆盖所有的颜色。
  在模拟自然界纹理的时候,我们有时不希望颜色映射到全域,我们只希望取得某种纹理的基色附近的颜色就可以了。这时我们可以限制颜色的上下限,这样,噪声值映射后就会被限定在某一颜色区域,这对我们模拟自然纹理是有帮助的,下面说明了这种方法的过程。

程序纹理应用之静态纹理生成_第1张图片

  在这里,我们正弦函数表示噪声值(实际噪声值不是正弦值),黄色表示颜色映射上限,红色表示颜色映射下限,映射时我们对噪声值采用clamp的方式,这样,映射后的颜色将会被限定在一定的颜色范围之内。在下面的纹理生成中,大理石、木纹、云我们采用这种生成方式。

(二)纹理映射

  采用颜色映射方式生成纹理的方法其结果是只能取到颜色空间的一个子空间,不能使用到全部颜色空间,这在某些自然纹理模拟中达不到效果,在一些复杂的纹理生成中,我们采用另一种映射方式,就是对特定纹理进行采样来生成新的纹理,这种方式的可以用下面的图来说明:

程序纹理应用之静态纹理生成_第2张图片

  在这里,我们正弦函数表示噪声值(实际噪声值不是正弦值),中间的色带是一张纹理,我们用噪声值对这张纹理进行采样,可以更灵活的控制颜色映射,使用不同的纹理,可以达到完全不同的效果。在下面的纹理生成中,火焰、巧克力我们采用这种生成方式。

二、几种常见纹理的生成

  在下面的纹理生成中,我们使用了上面论述的颜色映射方式。鹅卵石纹理模拟我们使用了Voronoi噪声,干裂的土地和巧克力纹理模拟我们使用了Worley噪声,其他纹理都是使用Simplex噪声生成。生成方法不再赘述。

(一)大理石

程序纹理应用之静态纹理生成_第3张图片

大理石一:青色大理石

程序纹理应用之静态纹理生成_第4张图片

大理石二:淡黄色大理石

程序纹理应用之静态纹理生成_第5张图片

大理石三:碎纹大理石

(二)木纹

程序纹理应用之静态纹理生成_第6张图片

木纹一

程序纹理应用之静态纹理生成_第7张图片

木纹二

(三)云

程序纹理应用之静态纹理生成_第8张图片

云纹理一

程序纹理应用之静态纹理生成_第9张图片

云纹理二

(四)鹅卵石

程序纹理应用之静态纹理生成_第10张图片

鹅卵石纹理

(五)干裂的土地

程序纹理应用之静态纹理生成_第11张图片

干裂土地纹理

(六)火焰

程序纹理应用之静态纹理生成_第12张图片

火焰纹理

(七)巧克力

程序纹理应用之静态纹理生成_第13张图片

巧克力纹理正视图

程序纹理应用之静态纹理生成_第14张图片

巧克力纹理侧视图

三、简单场景

  我们搭建了一个简易场景,使用了简易模型来使用上面创建的纹理,在使用中,部分纹理我们生成了法线纹理以改善细节光照信息,其他纹理未做任何处理,模拟还不够逼真,但如果真要运用可以与其他纹理进行混合,改善高光、环境光和渲染控制。

程序纹理应用之静态纹理生成_第15张图片

大理石桥

程序纹理应用之静态纹理生成_第16张图片

木头

四、代码下载

1、静态纹理生成,基于Unity2017.1.1f1 _ cg 静态纹理生成

2、简易场景,基于Unity2017.1.1f1 _ cg 简易场景

 参考文献

1、基于过程纹理的火焰、烟生成方法研究  丁维才  中国民用航空学院学位论文
2、Implementation of Perlin Noise on GPU An Independent study Implementation of Perlin Noise on GPU An Independent study

你可能感兴趣的:(Shader,Unity,图形学,程序纹理)