【发布时间】:2021-09-21 14:45:26
【问题描述】:
我目前正在编写一个简单的 SVG 解释器(当然不是详尽无遗,这将非常复杂),我发现自己正在努力使用
基本上,可能会产生两种类型的噪音:
- fractalNoise 实际上很容易生成,因为可以使用原始的 Perlin 噪声生成器(例如,可以在 here 找到示例代码)。
- turbulence 是默认过滤器,起初我认为唯一重要的因素是噪声是无散度的,所以我尝试将∇ xf 应用于只有 z 分量非null,以获得无散度的 2D 随机向量场(因为 ∇.(∇ xf) = 0)。问题是产生的噪音看起来不像它应该的那样。
这是 chrome 使用 fractalNoise 和 turbulence 生成的(来自here):
The images generated by chrome
以下是我用上面描述的数学可以产生的噪音:
My first try at turbulent noise
这里有很多问题。首先:在 SVG 解释器产生的噪音中,我不确定我是否理解颜色代表什么。分形噪声似乎比我的“更亮”,尽管它们都具有相同的“质量”(我的在所有颜色通道上从 0 变为 1)。
至于湍流噪声,生成 2D 场意味着我只有 2 个组件可以使用,而不是 3 个,但最重要的是,我确信这不是实际湍流噪声的生成方式。有谁知道这个噪声发生器的数学原理是什么?
谢谢!
【问题讨论】:
-
您可能会遇到色彩空间问题。 SVG 过滤器的默认颜色空间是线性 RGB - 与 sRGB 颜色空间不同 - 在 CSS 中的其他任何地方都使用它。如果您将“color-interpolation-filters=sRGB”添加到您的过滤器元素,您可能会得到符合您期望的东西。可以在这里找到确切的数学:w3.org/TR/SVG11/filters.html#feTurbulenceElement
-
嗨!非常感谢 !我正在编写的解释器实际上是在 OpenGL / GLSL 中,我正在使用片段着色器来生成噪声图像。所有的数学都是在线性色彩空间中完成的,并且只在最后执行到 sRGB 的转换,所以色彩空间应该不是问题……至于代码,非常感谢,我会检查一下:)
-
好的,所以我阅读了代码,如果我不考虑拼接部分(这实际上可能是真正重要的部分),它看起来像 湍流函数实际上只是八度噪声。这几乎是我已经用 GLSL 编写的代码。 turbulence feTurbulence 类型只是对八度音阶 Perlin 噪声的简单修改(例如采用绝对值)?我将在原始问题的答案中发布我的 GLSL 代码。
-
Chromium lib for perlin 噪音如果有帮助的话:source.chromium.org/chromium/chromium/src/+/main:third_party/… /** 它们不是两种完全不同的噪音。输出看起来不同,但是一旦在 [1, -1] 范围内生成噪声,通过执行以下操作将输出带回 [0, 1] 范围: * kFractalNoise_Type : noise * 0.5 + 0.5 * kTurbulence_Type : abs(噪音)*/
-
哦哦谢谢!所以这就是我所理解的,它现在似乎可以工作了:) 非常感谢
标签: math svg random noise svg-filters