首页 > 解决方案 > 获取 GLSL 顶点着色器位置以用于 cpu 事件碰撞器函数

问题描述

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

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

任何人都有更好的想法来处理这个问题?还是更好的方法?

标签: kivyglslshaderrendervertex

解决方案


这里的第一个标准是:您是否需要碰撞来进行拾取物理模拟?

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

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

  1. 您在 CPU 上复制几何体,并使用鼠标位置和相机视图创建与此几何体相交的射线,以查看首先击中的内容。
  2. 渲染场景后,您从深度缓冲区读回单个像素。(鼠标经过的像素。)使用返回的深度值以及相机信息,您可以重建世界中相应的 3D 位置。一旦你有了一个 3D 位置,你就可以查询你的世界,看看哪个物体最接近这个点,你就会得到你的命中。

推荐阅读