获取 GLSL 顶点着色器位置以用于 cpu 事件碰撞器函数

Get GLSL vertex shader positions back to use on cpu event collider functions

我正在使用 python kivy 将带有 opengl 的网格渲染到 canvas 上。我想 return 来自片段着色器的顶点数据,这样我就可以构建一个碰撞器(在进行投影和模型视图变换后用于我的 cpu 事件监听器)。我可以在 cpu 上复制矩阵乘法(我想这是最简单的方法),但是我将不得不做两次相同的计算(不好)。

我能想到的唯一方法(经过一些浏览后)是将一个对象 ID 印在我渲染的网格 alpha 通道上(如果我将数据编码保持在 alpha 的值 1 附近,不会有太大影响) .并在 cpu 端创建某种 'color picker' 来对其进行解码(我猜这使用 kivy 并不难)。

有人有更好的办法来处理这个问题吗?或者更好的方法?

这里的第一个标准是:你需要碰撞用于拾取还是用于物理模拟?

如果它是用于物理:您几乎不需要相同的网格来进行渲染和物理碰撞。通常,您对物理形状使用非常粗略的近似,几乎总是凸形或凸形的并集。 (碰撞任意凹面网格是任何物理引擎都做不到的事情,如果他们尝试这样做,性能会很差。)

如果是为了通过鼠标单击来拾取对象:您可以采用两种不同的方式:

  1. 在CPU上复制几何体,然后使用鼠标位置加上相机视图创建一条与该几何体相交的射线,看看是什么先打。
  2. 渲染场景后,您读回深度缓冲区中的单个像素。 (鼠标悬停的像素。)使用返回的深度值和相机信息,您可以在您的世界中重建相应的 3D 位置。一旦你有了 3D 位置,你就可以查询你的世界,看看哪个物体离这个点最近,你就会成功。