![de8793d02a0b966e46d8a19a6c76bcb2.png](https://img-blog.csdnimg.cn/img_convert/de8793d02a0b966e46d8a19a6c76bcb2.png)
Voronoi图是什么
严格的定义参照这里
z文聿:计算几何第四周:维诺图(Voronoi Diagram)zhuanlan.zhihu.com简单的讲,在本次实现中,就是给定图像中的一组点,称为种子点,对图像进行分割,使得每个区域中的点与某个种子点距离最短。
![85bab0311223ef8a6289e36e890202c9.png](https://img-blog.csdnimg.cn/img_convert/85bab0311223ef8a6289e36e890202c9.png)
上图中红色的点就是种子点。然后每个区域都用了不同颜色区分了。
Voronoi图在游戏中有什么应用
你可以用于AI:
How to Use Voronoi Diagrams to Control AIgamedevelopment.tutsplus.com![6f6daa855c4336a4d7b7a8b5278852db.png](https://img-blog.csdnimg.cn/img_convert/6f6daa855c4336a4d7b7a8b5278852db.png)
你可以用于地形生成:
火焰猫燐:Minecraft地图生成原理剖析(三)zhuanlan.zhihu.com![7232f0ca8beffb0d5b4d870dd5484473.png](https://img-blog.csdnimg.cn/img_convert/7232f0ca8beffb0d5b4d870dd5484473.png)
你可以用于纹理生成:
The Book of Shadersthebookofshaders.com![3250492e0ed07946ffa57f30e358749d.png](https://img-blog.csdnimg.cn/img_convert/3250492e0ed07946ffa57f30e358749d.png)
另外,在图像处理,图形学中Voronoi图应用相当广泛。
Voronoi图怎么计算
- 暴力计算:遍历每个点,对每个种子点计算距离,然后得到最近的种子点。可以,但是太笨了,太耗时了。
- 构建Delaunay三角网,然后计算Voronoi图。比较复杂,不适合GPU并行。
- Jump Flooding Algorithm,这个不是严密的计算方法,只是一种近似的计算方法。但是适合GPU计算,所以也是我采用的方法。
Jump Flooding Algorithm大致的思路是这样的:
- 将种子点不断向四周的8个点“扩散”,让被扩散的点计算与种子点的距离,选取最近的种子点,然后记录下来,直到所有点都被覆盖到。由于这是一个迭代的过程,每个迭代的最优解不一定得到最后的最优解。
- 扩散的间距逐步缩小,一开始是间距很大很远的8个点,然后每次迭代间距缩小一半,以n*n的图像为例,需要迭代log2(n)次,每次的间距为2^(log2(N) – passIndex – 1),passIndex 指的是第几次迭代,从0开始数。
看下面的图比较好懂:
![d13cbd56617f10ac5000e2f351b8d22d.png](https://img-blog.csdnimg.cn/img_convert/d13cbd56617f10ac5000e2f351b8d22d.png)
其中k就是扩散间距了。
在Unity中实时计算Voronoi图
也很简单,用Compute Shader进行迭代就可以了。
代码放这里了:
https://github.com/alpacasking/JumpFloodingAlgorithmgithub.com结果如何
以下都是实时录制的效果,具体计算时间没去测,不过在1080P下也能达到70多FPS。
为了方便看效果,特意让种子点随机运动了,然后种子点也是随机生成的。
![04cf1ad482415af1d98501fa598db588.gif](https://img-blog.csdnimg.cn/img_convert/04cf1ad482415af1d98501fa598db588.gif)
当然,有了Voronoi图,做距离变换(Distance Transform)也就水到渠成了。距离变换在图像处理中也很有用,感兴趣的童鞋自行查找。下面是距离变换的一些效果图,有点恶心。
![1c019a0d028be7b43dd139f956d9aae9.gif](https://img-blog.csdnimg.cn/img_convert/1c019a0d028be7b43dd139f956d9aae9.gif)
![fab86a86e257c2a740fb31fada0cec0c.gif](https://img-blog.csdnimg.cn/img_convert/fab86a86e257c2a740fb31fada0cec0c.gif)
参考文献:
- Rong G, Tan T S. Jump flooding in GPU with applications to Voronoi diagram and distance transform[C]//Proceedings of the 2006 symposium on Interactive 3D graphics and games. 2006: 109-116.
- https://blog.demofox.org/2016/02/29/fast-voronoi-diagrams-and-distance-dield-textures-on-the-gpu-with-the-jump-flooding-algorithm/