我目前正在使用Shader Model 4(DirectX 10 HLSL)实现3D Perlin噪声凹凸贴图 . 生成噪声本身并不是一个大问题(有大量的教程和代码),但我没有找到3D Perlin噪声的分析衍生物 .
考虑衍生品的唯一网站是Ińigo Quilez's site和相关的GameDev.net discussion . 问题是在第一个链接中噪声是基于值的,而不是基于梯度的(这是我的要求),在第二个链接中,只有2D梯度噪声导数 .
请注意,我不是在寻找数值导数,因为那些需要生成4个相邻的噪声样本,而且开销太多了 .
有人计算过这些衍生物吗?是否有使用它们的参考实现?
1 回答
我今天也无法在网上找到解决方案,所以我试图推导它 .
首先定义3D Perlin噪声的符号 .
表示法
假设3D Perlin噪声由三线性插值计算得出
其中
u
,v
,w
是分数坐标的五次多项式的插值因子(即改进的Perlin噪声):和
dot___
是格点处的梯度向量(gx___, gy___, gz___)
的点积和分数坐标:计算衍生品
首先,计算
u
,v
和w
的衍生物通过
Lerp(a, b, t) = a + (b - a) * t
扩展n
,然后取
n
的偏导数,,
,
那么
(nx, ny, nz)
是噪声函数的梯度向量(偏导数) .优化
如果编译器无法处理它,可以将一些常见的子表达式考虑在内 . 例如:
扩展的
n
中的系数被重复使用多次 . 它们可以通过以下方式计算衍生物也具有相似的系数,
n
的计算也可以使用扩展形式k0
,...k6
.最后的话
已经针对中心差分方法验证了该解决方案 .
虽然这个解决方案看起来很笨拙,但我的实验(仅限CPU,SSE)表明,通过这种解决方案计算这些衍生物只会产生大约 50% extra time 来计算单个3D Perlin噪声样本 .
有限差异至少需要300%的额外时间(做额外的3个样本)或600%(为中心差异做6个样本) .
因此,该解决方案在性能方面更好,并且还应该在数值上更稳定 .