第5章,改进的Perlin噪声的实现

这篇文章主要是写了以下几方面
1,原始的perlin噪声函数是什么
2,原始噪声函数的缺陷是什么?
3,如何改进噪声函数?
4,shader中如何实现。

一,原始的Perlin噪声函数
分为几个步骤
1,在球体上设置散列得到的256个伪随机斜率。
在这里插入图片描述
2,对于整数的空间坐标(i,j,k)的噪声函数设置为0,即Noise(i,j,k)=0;(i,j,k为整数)
3,将指定的要计算的空间坐标(x,y,z)分解为整数和小数部分,即,x=i+u;y=j+v;z=k+w(其中,i,j,k为整数,u,v,w是小数部分),比如,(1.1,2.2,3.5)=(1+0.1,2+0.2,3+0.5)。
4,围绕坐标(x,y,z)的整数部分(i,j,k),设置周围的8个整数部分加1的点,形成单位正方体,即(i,j,k),(i+1,j,k),(i+1,j+1,k),(i,j+1,k),(i,j,k+1),(i+1,j,k+1),(i+1,j+1,k+1),(i,j+1,k+1),这样,坐标(x,y,z)就落在了单位正方体内部。
还以(1.1,2.2,3.5)为例,周围的8个坐标就是(1,2,3),(2,2,3),(2,3,3),(1,3,3),(1,2,4),(2,2,4),(2,3,4),(1,3,4)
5,对单位正方体的8个顶点,使用Hermite三次混合函数3t2-2t3,制作一个查询表。
6,使用(x,y,z)的小数部分(u,v,w)在查询表内插值,即可得到Noise(x,y,z)
在这里插入图片描述
二,原始算法的缺陷
1,伪随机斜率在球面分布不规则,相邻斜率可能离得很近,这样会导致高频结果,使噪声函数出现污点。
2,插值函数是3t2-2t3,二次求导结果是6-12t,在0和1上有非零。这样会在凹凸贴图上失真,因为凹凸贴图表面的光照效果随对应的高度函数改变。

三,改进
1,伪随机斜率
(1)用斜率方向的均匀统计分布替代具体的大量斜率值
(2)使用12个伪随机斜率,它们由立方体12条棱的中点组成(0,1,1),(0,-1,-1),(0,1,-1),(0,-1,1),(1,0,1),(-1,0,-1),(1,0,-1),(-1,0,1),(1,1,0),(-1,-1,0),(-1,1,0),(1,-1,0),好处是,这些斜率离得不近,不会出现高频结果;且计算容易,乘法转换为加法,比如,(x,y,0)和(1,1,0)点积结果=x+y.

2,改变插值函数为5次样条6t5-15t+10t3,这样t=0和t=1时,结果为0

四,实现凹凸贴图
凹凸贴图是噪声的一个应用,可以独立于分辨率。即,当接近一个物体时,纹理不会变模糊,保持清晰的细节。
1,步骤
(1)指定噪声函数F(x,y,z)
(2)选择小的delta值,计算下面几个量
F0 = F(x,y,z)
Fx = F(x+delta,y,z)
Fy = F(x,y+delta,z)
Fz = F(x,y,z+delta)
(3)计算F在(x,y,z)的斜率(导数)矢量
dF = [(Fx-F0) /delta,(Fy-F0) /delta,(Fz-F0) /delta]
(4)从表面结果减去这个斜率,然后把结果再归一化回单位长度
N = normalize(N-dF)
2,shader实现的三个示例
在这里插入图片描述
对于多瘤图案,
0.03 * noise(x,y,z,8);
大理石
0.01 * stripes(x+2 * turbulence(x,y,z,1),1.6);
皱纹
-0.10*turbulence(x,y,z,1);

在下列的函数中定义:
double stripes(double x, double f)
{
double t = 0.5 + 0.5 * sin(f * 2 * PI *x);
return t * t - 0.5;
}

double turbulence(double x ,double y, double z, double f)
{
double t = -0.5;
for(; f <= imageWidth/12; f *= 2)
{
t += abs(noise(x,y,z,f)/f);
}
return t;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值