标题中的“PT”表示:Procedural Texture(过程纹理)。表示该章节属于“过程纹理”的内容。
当前章节在“过程纹理”内容中的位置:
过程纹理(0)——概述
过程纹理(1)——方格纹理(1)——3D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(1)——平面2D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(2)——球面2D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(3)——圆柱2D方格纹理
过程纹理(2)——纹理的仿射变换
过程纹理(3)——基于噪声的纹理(0)——概述
过程纹理(3)——基于噪声的纹理(1)——基本的基于噪声的纹理(Basic Noise-Based Textures)
0,定义“晶格噪声”对应的类LatticeNoise
先看一下LatticeNoise的继承关系图:
1,定义及初始化“噪声数组”
2,实现hash(打乱)算法
3,插值方式
我们接下来会用到的插值方式是:线性插值、三次插值。
插值的具体分析,在此不表(或者说,留坑在此,后续在填吧)。这里直接贴出相关代码。
对晶格中各个顶点的“噪声数据”进行插值运算得到撞击点P对应的噪声值(即所谓的“噪声函数”,由于插值的方式不同,可能得到两种“噪声函数”:Linear Noise、Cubic Noise)
3.1 线性插值对应LinearNoise
3.2 三次插值对应CubicNoise
由于“三次插值”的效果比“线性插值”的好,所以后续我们使用的是“三次插值”。
4,对噪声函数值“求和”
前面我们已经提到,我们会用到三种求和方式:Fractal Sum、Turbulence、Fractal Brownian Motion。接下来,我们依次进行说明。
4.1 Fractal Sum
求和公式:
求和过程中整体噪声函数图形变化如下图:
对应C ++代码:
4.2 Turbulence
求和公式:
对应C++代码:
4.3 Fractal Brownian Motion
求和公式:
发现:若gain=0.5、lacunarity=2的fBm其实就是Fractal Sum。
对应C++代码:
5,Basic Noise Texture
接下来定义两种基本的基于噪声的纹理(分别对应前面的“求和”方式,fractal sum是Fractal Brownian Motion的一种特殊形式):TurbulenceTexture、FBmTexture。
5.1 TurbulenceTexture
5.2 FbmTexture
6,测试图形
6.1 测试代码
6.2 输出图形
Turbulence,求和项数2,求和幅值0.75,求和频率2
Turbulence,求和项数8,求和幅值0.75,求和频率2
FBm,求和项数2,求和幅值0.5,求和频率2(即Fractal Sum)
FBm,求和项数8,求和幅值0.5,求和频率2(即Fractal Sum)
FBm,求和项数2,求和幅值0.25,求和频率2
FBm,求和项数2,求和幅值0.75,求和频率2
FBm,求和项数2,求和幅值0.75,求和频率8
FBm,求和项数2,求和幅值0.25,求和频率8
FBm,求和项数8,求和幅值0.25,求和频率8
FBm,求和项数8,求和幅值0.75,求和频率8
FBm,求和项数8,求和幅值0.75,求和频率2
FBm,求和项数8,求和幅值0.25,求和频率2
7,其他说明
完整代码下载路径: http://download.csdn.net/detail/libing_zeng/9798075
Referrance:
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K PetersLtd, 2007.