typo fix
This commit is contained in:
parent
0f30cd2abe
commit
e6df30ffbf
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## 网格噪声(Cellular Noise)
|
||||
|
||||
1996 年,在原始的 Perlin Noise 发布六年后,Perlin 的 Simplex Noise 发布五年前,[Steven Worley 写了一篇名为“A Cellular Texture Basis Function”的论文](http://www.rhythmiccanvas.com/research/papers/worley.pdf). 在这篇论文里,他描述了一种现在被广泛使用的程序化纹理技术。
|
||||
1996 年,在原始的 Perlin Noise 发布六年后,Perlin 的 Simplex Noise 发布五年前,[Steven Worley 写了一篇名为“A Cellular Texture Basis Function”的论文](http://www.rhythmiccanvas.com/research/papers/worley.pdf)。在这篇论文里,他描述了一种现在被广泛使用的程序化纹理技术。
|
||||
|
||||
要理解它背后的原理,我们需要从**迭代**开始思考。你可能已经知道迭代是什么意思:对,就是使用 ```for``` 循环。在 GLSL 的 ```for``` 循环中,只有一个需要注意的:我们检查循环是否继续的次数必须是一个常数(```const```). 所以,没有动态循环——迭代的次数必须是固定的。
|
||||
|
||||
|
|
@ -112,7 +112,7 @@ for (int y= -1; y <= 1; y++) {
|
|||
|
||||
上面的代码源自[这篇 Inigo's Quilez 的文章](http://www.iquilezles.org/www/articles/smoothvoronoi/smoothvoronoi.htm),他写道:
|
||||
|
||||
*“可能值得注意的是,在上面的代码中有一个很漂亮的技巧。多数实现都存在精度问题,因为他们是在“瑜”空间(如“世界”或“对象”空间)内产生随机点,这可能是里原点任意远的。要解决这个问题,可以使用更高精度的数据类型,或更聪明些。我的实现不是在“瑜”空间(如“世界”或“对象”空间)内产生随机点,而是在“网格”空间内:一旦提取了着色点的整数和小数部分,我们当前的网格就确定了,我们所关心的就是在这个网格周围发生了什么,意味着我们可以将所有坐标的整数部分放在一起,从而节省了许多精度位。事实上,在一个常规的 voronoi 实现中,当从着色点减去随机特征点时,点坐标的整数部分简单地消除掉了。在上面的实现中,我们甚至不会上这种消除发生,因为我们正在把所有的计算移到“网格”空间。这个技巧可以让你处理这种情况: 你想要把 voronoi 用在整个星球上——可以简单地将输入替换为双精度,执行 floor() 和 fract() 计算,其余的计算仍使用浮点数,不需要将整个实现改变成双精度的成本。当然,同样的技巧也适用于 Perlin Noise 模式(但是我还没有在任何地方看到过它的实现或记录)。”*
|
||||
*“可能值得注意的是,在上面的代码中有一个很漂亮的技巧。多数实现都存在精度问题,因为他们是在“域”空间(如“世界”或“对象”空间)内产生随机点,这可能是里原点任意远的。要解决这个问题,可以使用更高精度的数据类型,或更聪明些。我的实现不是在“域”空间(如“世界”或“对象”空间)内产生随机点,而是在“网格”空间内:一旦提取了着色点的整数和小数部分,我们当前的网格就确定了,我们所关心的就是在这个网格周围发生了什么,意味着我们可以将所有坐标的整数部分放在一起,从而节省了许多精度位。事实上,在一个常规的 voronoi 实现中,从着色点减去随机特征点时,点坐标的整数部分简单地消除掉了。在上面的实现中,我们甚至不会让这种消除发生,因为我们正在把所有的计算移到“网格”空间。这个技巧可以让你处理这种情况: 你想要把 voronoi 用在整个星球上——可以简单地将输入替换为双精度,执行 floor() 和 fract() 计算,其余的计算仍使用浮点数,不需要将整个实现改变成双精度的成本。当然,同样的技巧也适用于 Perlin Noise 模式(但是我还没有在任何地方看到过它的实现或记录)。”*
|
||||
|
||||
简要重述一遍:我们把空间分割成网格,计算每个像素点到它所在网格中的那个特征点的距离,和它到相邻的八个网格中的特征点的距离,结果是一个距离场,如下所示:
|
||||
|
||||
|
|
@ -132,7 +132,7 @@ for (int y= -1; y <= 1; y++) {
|
|||
|
||||
### Voronoi 算法
|
||||
|
||||
用网格噪声构造 Voronoi 图远没有看上去的那么难。我们只需要*保留*一些关于最近的特征点的额外信息。我们将要用到一个叫 ```m_point``` 的 ```vec2``` 类型变量存储像素点到最近的特征点的向量,而不只是距离。instead of just the distance, we will be "keeping" a "unique" identifier of that point.
|
||||
用网格噪声构造 Voronoi 图远没有看上去的那么难。我们只需要*保留*一些关于最近的特征点的额外信息。我们将要用到一个叫 ```m_point``` 的 ```vec2``` 类型变量存储像素点到最近的特征点的向量,而不只是距离。
|
||||
|
||||
```glsl
|
||||
...
|
||||
|
|
@ -149,7 +149,7 @@ for (int y= -1; y <= 1; y++) {
|
|||
|
||||
注意那个移动的(鼠标位置下面那个)细胞的颜色是如何根据它的位置而改变的。那是因为它的颜色由最近特征点决定。
|
||||
|
||||
就像我们之前所做的那样,现在是扩大规模的时候,转而使用 [Steven Worley 的论文中的方法](http://www.rhythmiccanvas.com/research/papers/worley.pdf)。试着自己实现它。你可以通过点击下面的实例来获取帮助。注意 Steven Worley 的原始方法中,每个网格的特征点数是可变的,对大多数网格来说不止一个。在他的 C 语言实现中,这是用来提早退出来加速循环。GLSL 循环不允许动态的迭代次数,所以你可能更希望一个网格对应一个特征点。
|
||||
就像我们之前所做的那样,现在是扩大规模的时候,转而使用 [Steven Worley 的论文中的方法](http://www.rhythmiccanvas.com/research/papers/worley.pdf)。试着自己实现它。你可以通过点击下面的示例来获取帮助。注意 Steven Worley 的原始方法中,每个网格的特征点数是可变的,对大多数网格来说不止一个。在他的 C 语言实现中,这是用来提早退出来加速循环。GLSL 循环不允许动态的迭代次数,所以你可能更希望一个网格对应一个特征点。
|
||||
|
||||
<a href="../edit.php#12/vorono-01.frag"><canvas id="custom" class="canvas" data-fragment-url="vorono-01.frag" width="520px" height="200px"></canvas></a>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue