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

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

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

评论

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

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

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

您可能会检查出这种在球体上产生噪声的shadertoy:shadertoy.com/view/4sfGzS

#1 楼

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

对于自然存在于球体表面范围内的梯度噪声,您需要规则的采样模式表面上具有自然连通性信息的点,每个单元中的面积大致相等,因此您可以插值或求和相邻的值。我想知道斐波那契网格之类的方法是否可以工作:



我还没有仔细研究数学以确定要计算出多少指数的指标是多少和四个邻居的距离(我什至不知道您是否在所有情况下最终都拥有四个定义明确的邻居),我怀疑这可能不如简单地使用3D噪点有效。

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


如果要渲染球体,不仅要评估球体表面上的噪声,还可以对曲面进行细分为解决噪声点阵的分辨率,您可以在球体的表面(通常是细分的二十面体)上创建测地线网格:



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

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

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

评论


$ \ begingroup $
我以前从未听说过斐波那契网格;太酷了!
$ \ endgroup $
–内森·里德(Nathan Reed)
15年8月5日在21:09

$ \ begingroup $
这是一篇引人入胜的论文。看起来您可以调整参数以使其更接近于正方形网格或六边形网格,这将允许使用不同的方法来生成噪声。
$ \ endgroup $
– trichoplax
2015年8月9日在22:43

$ \ begingroup $
在贴图的边缘(边缘包裹)附近插值时,我得到了一些不错的结果,但这取决于您要实现什么效果以及确切的噪声参数。对于有些模糊的噪声效果很好,而对于尖峰/细粒度的噪声效果不佳。
$ \ endgroup $
–user379
15年8月13日在3:17