2017-09-13 64 views
-1

首先,我是通用的WebGL,Op​​enGL编程的新手。我认为这些工具可以让我解决一个问题,但我不知道从哪里开始。大规模光线投射和计数命中

我的问题: 给定一个起点,一个目标(三角形或网状)和多方向矢量(千)清单,有没有用我的GPU来算击中目标的光线数量的方式?理想情况下,我想用我的GPU的能力来解决这个问题,因为它似乎比我的CPU更适合它。

我相当肯定我可以用我的cpu编写一些代码来做到这一点,但是它需要很长时间才能在for循环中通过我的向量。

感谢

+0

你的光线的方向矢量是随机分布还是形成一个统一的网格?与光线数量相比,您有多少个三角形? – Quinchilion

+0

方向尽可能随机,但只限于一个半球。一般来说,我将处理一个简单的目标与少于十几个三角形。在某些情况下,需要查看3到4个单独的目标。 – user2693883

回答

0

你可以试试这个,这不是begginers的事情,但:

  1. Store中的三角形/网格在VBO,这是比较容易的部分。
  2. 将您的方向矢量存储在纹理中也很容易。使用实例化渲染。这样每个着色器实例都有一个不同的标识符。
  3. 使用该标识符从纹理进行采样。每个着色器实例都有不同的方向向量。
  4. 现在,棘手的部分:着色器在某个缓冲区中增加一个值(已计算的点击次数)。使用图片。请阅读 wiki Image Load Store约 他们,特别是“原子操作”部分。
  5. 最后,使用其他着色器读取该图像的值。
+0

现在绝对超出我的能力,但至少这是一个起点。我现在可以研究这些概念并希望能够解决这个问题。以前甚至都不知道我的搜索中包含哪些条款。 – user2693883

0

我看到实现你正在尝试做的一种方式,就是用另一种方式来思考你的问题,在屏幕上的一种“反向”光线投射。

你说你只有一个原点,一个目标,和很多的方向。因此,它大致类似于光线跟踪渲染,因此您可以从WebGL制作的角度来思考问题:使用投影矩阵在屏幕上绘制3D对象。

  • 创建一个投影矩阵对应于您的原点为的观点,在看目标,与适当的FOV

  • 渲染在平坦颜色的对象(黑色背景上的例如白色)在一个纹理,使用这个投影矩阵。

  • 使用相同的投影矩阵将射线“投影”到2D纹理坐标中。

  • 检查光线方向的结果2D坐标中的纹理像素:如果像素是白色,则此光线会撞击物体。

你甚至可以使用另一种着色器来实现的最后两个部分,通过传送光线方向的顶点缓存,与在片段着色器之前创建的质感。问题将是从着色器获得递增的值。