如何在球体上产生程序噪声?


15

我想在球体表面上产生程序性噪音(例如,程序性地产生行星或大理石纹理的球)。当然,我可以采用一种标准的噪声算法并将其映射到球体上,但这存在将平面投影到球体上的所有问题,例如极点或其他地方的变形。

我想我可能会产生体积噪声并“切出”球体,但这似乎不必要地效率低下-并且,如果该噪声具有一些基于网格的伪像,则这些伪像仍不会均匀地出现在球体上。此外,至少在单工噪声的情况下,从3D噪声中切出2D切片通常看起来与立即生成2D噪声不同。

有什么方法可以避免这些问题,例如通过在球体上自然产生噪声?噪声至少应具有Perlin噪声的质量,理想情况下应具有Simplex噪声的质量


如GPU Gems 3所示,也许是三行投影?问题是,当噪声在不同的投影之间混合时,噪声看起来是模糊的还是不希望的。
内森·里德

我在帖子中添加了另一种可能的方法。可能需要用更详细的要求来澄清您的问题。即,为什么3D噪声的2D切片不能满足您的视觉要求?您对性能有何要求?
John Calsbeek 2015年

@JohnCalsbeek老实说,我手头没有任何硬性要求。这只是我很好奇的一个问题,我以为我愿意参加私人测试版。当然,从3D噪声中切出2D切片对于许多应用程序就足够了,但是我敢肯定,这会对性能和各向异性产生影响(这可能会或可能不会很明显)。“将球体从3D噪声中剔除是您的最佳选择,因为...”绝对是一个正确的答案。
马丁·恩德

您可能会检查出这种在球体上产生噪声的shadertoy
Alan Wolfe

Answers:


15

我会考虑只使用3D噪声并在球体表面进行评估。

对于自然位于球体表面范围内的梯度噪声,您需要在表面上使用规则的采样点模式,这些采样点应具有自然的连通性信息,并且每个像元的面积大致相等,因此可以对相邻值进行插值或求和。我不知道像斐波那契网格这样的东西是否可以工作:

球面上的斐波那契网格

我还没有仔细研究过数学以确定要计算出四个邻居的指数和距离的工作量(我什至不知道您是否在所有情况下最终都拥有四个定义明确的邻居),而且我怀疑它可能比仅使用3D噪点效率低。

编辑:有人咀嚼了数学!请参阅有关球形斐波那契映射的新论文。使其适应球面噪声似乎很简单。


如果您要绘制球体,不仅要评估球体表面上的噪声,而且可以将球体细分为噪声格的分辨率,则可以在球体表面上创建测地线网格(细分的二十面体,通常):

测地线

球体的每个顶点都可以具有随机生成的用于梯度噪声的梯度。要将这些信息传递到像素着色器(除非您希望像值噪声那样简单地进行插值),您可能需要类似本文的带有重心坐标线框渲染的技术:进行无索引渲染,每个顶点都包含三角形中该顶点的重心坐标。然后,您可以从SV_PrimitiveID像素着色器中读取(或OpenGL等价的),基于所处的三角形从顶点读取三个噪声梯度,并使用插值重心坐标使用任何喜欢的噪声计算。

我认为此方法最困难的部分是想出一种方案,将三角形ID映射到三个样本,以便查找每个顶点的噪声值。

如果需要比噪声模型更精细的分辨率的多个八度音或噪声,则可以使用顶点制作粗略的测地线网格,并可以在像素着色器中进行几个细分。即从重心坐标,找出如果网格进一步细分,您处于哪个细分三角形,然后找出该三角形的原始ID和重心坐标。


2
我以前从未听说过斐波那契网格。太酷了!
内森·里德

那是一篇引人入胜的论文。看起来您可以调整参数以使其更接近于正方形网格或六边形网格,这将允许使用不同的方法来生成噪声。
trichoplax

我在瓦片的边缘(边缘包裹)的附近插值了一些不错的结果,但这取决于您要实现什么效果以及确切的噪声参数。对于有些模糊的噪声效果很好,而对于尖峰/细粒度的噪声效果不佳。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.