【问题标题】:Rasterize polygons on GPU for hit-testing在 GPU 上栅格化多边形以进行命中测试
【发布时间】:2014-12-21 03:20:00
【问题描述】:

任务

对多边形执行许多命中测试。我有大约 10,000 个多边形,每个多边形有 1,000 个点。将对这些多边形执行大约 100,000,000 次命中测试。多边形可以相互接触,但从不重叠。

解决方案

对每个命中测试进行简单的多边形点测试。

问题

太慢了。

改进

栅格化多边形并检查命中测试的像素属于哪个多边形。

新问题

多边形的光栅化很慢。我正在使用这个算法:http://alienryderflex.com/polygon_fill/

想法

在 GPU 上栅格化多边形,因为它已针对此任务进行了优化,并且可以在硬件中执行。

问题

你对我的想法有什么看法,你能给我建议从哪里开始吗?它会带来高性能吗?

旁注

该区域很少被多边形覆盖。我想维护一个像素列表而不是位图。

【问题讨论】:

  • 您是否尝试过使用标准图形库(GDI、Direct** for Windows、OpenGL 等)进行光栅化?
  • 这些库总是直接在屏幕上绘制。我不想画画。我想执行命中测试。
  • 不,它们可以绘制到内存上下文(在 MemDC 中选择位图)。如果多边形坐标在合理的范围内,这是解决像您这样的问题的有效方法
  • 如何获得多边形命中的像素?我必须通过整个位图吗?那不是效率低下吗(将薄马蹄形想象成多边形)?
  • 你为什么想要被多边形击中的像素?您可以在进行命中测试的任何位置对位图进行索引,然后只获得 1 个像素来显示它是否命中。

标签: performance algorithm gpu polygon raster


【解决方案1】:

如果可以,此答案建议使用 GPU: How can I determine whether a 2D Point is within a Polygon?

您的案例似乎主要是命中测试,这是 O(1) 的光栅化。 GPU 能够光栅化到内存,但我不知道任何能够处理点列表的 GPU / 渲染 API。此外,使用点列表,您可能会丢失 O(1) 运行时进行命中检查。您可以通过使用 16 位光栅缓冲区来节省一些内存(不确定这对于您的 GPU 设置是否可行——但您似乎只需要 10000 种颜色)。

【讨论】:

  • 我选择了 GDI,它的速度非常快!
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2020-07-13
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多