大规模的光线投射和计数命中

时间:2017-09-13 11:03:12

标签: opengl-es glsl webgl raycasting

首先,我是WebGL的新手,一般是OpenGL编程。我认为这些工具可以让我解决问题,但我真的不知道从哪里开始。

我的问题: 给定单个原点,目标(三角形或网格)和许多(数千)方向向量的列表,有没有办法使用我的GPU来计算击中目标的光线数量?理想情况下,我想利用GPU的强大功能来解决这个问题,因为它似乎比我的CPU更适合它。

我很确定我可以使用我的cpu编写一些代码来执行此操作,但是在for循环中通过我的向量需要很长时间。

由于

2 个答案:

答案 0 :(得分:0)

你可以试试这个,虽然这不是一个让步的东西:

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

答案 1 :(得分:0)

我认为实现你正在尝试做的事情的方法是以另一种方式思考你的问题,以某种方式反转"来自银幕的光线投射。

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

  • 使用适当的FOV创建与您的原点对应的投影矩阵,查看您的目标

  • 在纹理中以平面颜色(例如黑色背景上的白色)渲染对象,使用此投影矩阵。

  • 使用相同的投影矩阵来预测"项目"你的光线进入2D纹理坐标。

  • 检查光线方向生成的2D坐标中的纹理像素:如果像素为白色,则此光线会击中对象。

您甚至可以使用另一个着色器来实现最后两个部分,方法是将光线方向传递到顶点缓冲区中,并在片段着色器中使用先前创建的纹理。问题是从着色器获取增量值。