首页 > 解决方案 > 是否有可能在 python-opengl 中获得“不可见”顶点的索引,如 gloo、glumpy?

问题描述

是否有可能在 python-opengl 中获得“不可见”顶点的索引,如 gloo、glumpy?例如,当我在场景图中绘制一个 3D 球体并使用转台相机旋转对象时,一半的顶点是不可见的,但每当我旋转时,索引都会改变。

如果我打开 'cull_face' 选项,OpenGL 将不会绘制它们,但是是否有可能获得这些顶点的索引,'未绘制'或由于被其他顶点阻挡而不可见?

标签: pythonopenglglumpygloo

解决方案


但是是否有可能获得这些顶点的索引,“未绘制”或由于被其他顶点阻挡而不可见?

OpenGL 不会直接提供这样的功能。当然,它仍然可以实现。但是你需要自己实现。这里有一些想法:

  • 绘制完之后,通过将每个顶点渲染为单独的查询点来使用 OpenGL遮挡查询- 我不会在性能方面推荐它,但可以做到。
  • 由于您基本上对面部剔除感兴趣,因此只需自己计算面部剔除即可。对于每个三角形,你只需要计算法线向量,它就是两条边的叉积,然后检查视图方向向量和法线之间的角度是在90度以上还是90度以下,所以它是一个简单的点积。这种方法可以很容易地移植到 GPU 计算着色器中,并且可以轻松地并行运行,因为每个三角形都可以独立测试 - 它也应该在 GPU 上实现,因为您还可以使用它的强大功能来转换具有完全相同矩阵的顶点和以前一样,因为这会导致观察方向是恒定的(0,0,1)在窗口空间中,点积将只产生点积的 z 坐标,它只是顶点坐标在窗口空间中的二维投影的有符号区域。
  • 您还可以通过检查从相机到每个顶点的光线是否相交来进行简单的光线投射。您可以在此处轻松应用投影矩阵,因此每个视图光线都将变为正交,然后您可以简单地针对 z 缓冲区进行测试。这种方法也可以在 GPU 上实现。

推荐阅读