voronoi图代码_在Unity中实时计算Voronoi图
Voronoi图是什么
严格的定义参照这里
z文聿:计算几何第四周:维诺图(Voronoi Diagram)zhuanlan.zhihu.com
简单的讲,在本次实现中,就是给定图像中的一组点,称为种子点,对图像进行分割,使得每个区域中的点与某个种子点距离最短。
上图中红色的点就是种子点。然后每个区域都用了不同颜色区分了。
Voronoi图在游戏中有什么应用
你可以用于AI:
How to Use Voronoi Diagrams to Control AIgamedevelopment.tutsplus.com
你可以用于地形生成:
火焰猫燐:Minecraft地图生成原理剖析(三)zhuanlan.zhihu.com
你可以用于纹理生成:
The Book of Shadersthebookofshaders.com
另外,在图像处理,图形学中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开始数。
看下面的图比较好懂:
其中k就是扩散间距了。
在Unity中实时计算Voronoi图
也很简单,用Compute Shader进行迭代就可以了。
代码放这里了:
https://github.com/alpacasking/JumpFloodingAlgorithmgithub.com
结果如何
以下都是实时录制的效果,具体计算时间没去测,不过在1080P下也能达到70多FPS。
为了方便看效果,特意让种子点随机运动了,然后种子点也是随机生成的。
当然,有了Voronoi图,做距离变换(Distance Transform)也就水到渠成了。距离变换在图像处理中也很有用,感兴趣的童鞋自行查找。下面是距离变换的一些效果图,有点恶心。
参考文献:
- 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/
voronoi图代码_在Unity中实时计算Voronoi图相关推荐
- 公众号滑动图代码_实用技巧:公众号封面图如何提取?
有好友留言说:经常看到很骚气的公众号封面,该怎么提取下载呢! 今天就告诉你,公众号的高清封面图如何下载!一共有3种方法: 01.网页代码直接下载 ①在浏览器打开公众号文章,在网页空白处鼠标右键,点击查 ...
- Unity中的法线贴图、漫反射及高光
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性.在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了. 我 ...
- 项目思维导图软件测试分析,在软件测试中使用思维导图技术
我们的大脑比书面文字更能处理和回忆视觉效果.视觉图像能够以描述性词语无法描述的方式带来快速的清晰度和理解.思维导图是利用这个事实来形象化地组织和呈现信息的工具. 思维导图软件测试 思维导图是一个想法或 ...
- ios开发中计算代码运算时间_理解Unity中的优化(二):内存
内存: 内存消耗是一个关键的性能指标,尤其是在内存资源有限的平台上,比如低端移动设备. 内存消耗分析: 在Unity中诊断内存问题,Unity介绍了一款开元的可视化内存分析工具--MemoryProf ...
- 使用示例_在Unity中使用ComputeShader示例
写这篇的缘由是最近老师给了一个UE4的工程,是一个海水模拟的Demo,实现了二十年前一篇paper的算法,paper的地址是: http://citeseerx.ist.psu.edu/viewdoc ...
- unity 控制点 贝塞尔曲线_在Unity中使用贝塞尔曲线(转)
鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...
- excel箱形图中位数_在Excel中创建简单的箱形图
excel箱形图中位数 A box plot (box and whisker chart) lets you show how numbers are distributed in a set of ...
- unity项目源码_在Unity中使用protobuf
Protocol Buffers (通常简称为protobuf) 是Google开发的一种格式,这种格式与开发语言无关.与运行平台无关,用于序列化结构数据,并且很容易扩展.这种格式可以用于通信协议.数 ...
- eclipse查看mysql代码_在eclipse中查看Android源代码
声明:高手跳过此文章 当我们在eclipse中开发android程序的时候,往往需要看源代码(可能是出于好奇,可能是读源码习惯),那么如何查看Android源代码呢? 比如下面这种情况 图一 假设我们 ...
- ugui unity 取消选择_关于Unity中的UGUI优化,你可能遇到这些问题
关键字 界面制作 网格重建 界面切换 加载相关 字体 一.界面制作 Q1:UGUI里的这个选项 ,应该是ETC2拆分Alpha通道的意思,但是在使用中并没起作用?请问有没有什么拆分的标准 ...
最新文章
- onclick 获取点击之后的img 的id_前端,点击按钮跳出视频带蒙层,且视频永远居于屏幕中间...
- Java Array 常见报错
- redis 未授权访问详解
- 网站栏目该如何做SEO优化?
- LeetCode 836. 矩形重叠
- 数据结构基础(17) --二叉查找树的设计与实现
- java的程序编码_Java 程序编码规范(初学者要牢记)
- 墙面有几种装修方法_墙面怎么装修?这五个方案供你选择
- php内置web server
- echarts地图自动轮播
- Shiro集成Cas单点登录
- 马云对创业者的经典点评
- python文件管理api_python调用有道智云API实现文件批量翻译
- HTB-Sequel
- Spring框架总结(8)
- android 下的 WATCHDOG(2)
- java 使用Spire.Doc实现Word文档插入图片
- 第十三届蓝桥杯《EDA设计与开发》赛后总结
- 齐次坐标(Homogeneous coordinates)
- AspectJ 学习笔记
热门文章
- 深度学习优化算法大全系列6:Adam
- linux查看进程占用内存与ps命令
- mongo性能测试demo 代码正确运行
- Linux内核绑定1号cpu,Linux绑定硬件IRQ到指定CPU核
- chrome ubuntu_ubuntu 安装chrome
- 华中科技大学历年计算机专业分数线,【华中科技大学】历年在各省份各专业的录取分数线...
- myisam为什么比innodb查询快_那些还不会MySQL锁的程序员们,求你快看看这篇文章吧...
- php 去除空格和换行
- java rt.jar的源代码的位置
- springboot启动 fastDFS启动报错 mbeanExporter: defined by method 'mbeanExporter' in class path