0

我目前正在尝试在我的项目中实现剪影算法(使用 Open GLES,它适用于移动设备,目前主要是 iPhone)。其中一个要求是绘制一组 3D 线。默认 OpenGL 线的问题在于,当它们很粗时(出现间隙),它们不能很好地以某个角度连接。其他微妙的伪影也很明显,它们降低了线条的视觉吸引力。

现在,我已经研究过使用某种四边形条作为替代方案。但是,在屏幕空间中绘制四边形需要某种可见性检测——在实际 3D 世界中被遮挡的线条不应该是可见的。

有许多方法可以解决这个问题 - 即定量不可见性。但考虑到需要采用光线投射,这种方法很难有效实施,尤其是在处理能力有限的移动设备上。环顾四周,我发现了这篇论文,它描述了几种使用 z-buffer 采样来实现这种效果的方法。但是,我不是这方面的专家,虽然我在一定程度上了解这些技术背后的理论,但我不确定如何进行实际实施。我想知道是否有人可以在技术层面指导我 - 在 OpenGLES 方面。我也愿意接受有关一般 3D 线可见性的任何建议。

4

2 回答 2

0

我制定了一个在 iPhone 4S 上运行良好的解决方案(未在任何其他设备上测试)。它建立在渲染世界空间四边形的思想之上,并在 GPU 上进行轮廓检测。它按照以下方式工作(双关语不是故意的):

  • 我们生成边缘信息。这由网格中的边/“线”列表组成,对于每个我们关联两个法线,它们代表边两侧的 tris。
  • 这被处理成一组上传到 GPU 的四边形 - 每个四边形代表一条边。每个四边形的每个顶点都伴随着三个属性(vec3s),即边缘方向向量和两个相邻的三法线。所有四边形都通过无“厚度” - 即两端的顶点位于相同的位置。然而,对于相同位置的每个顶点,边缘方向向量是相反的。这意味着它们将在需要时以相反的方向挤出以形成四边形。
  • 我们通过在每个三范数和视图向量之间执行两个点积并检查它们是否具有相反的符号来确定顶点是否是顶点着色器中可见边的一部分。(有关详细信息,请参阅网络周围的标准轮廓算法)
  • 对于属于可见边缘的顶点,我们采用边缘方向向量与视图向量的叉积来获得面向屏幕的“挤出”向量。我们将此向量添加到顶点,但除以投影顶点的 w 值以创建恒定厚度四边形。

这并不能直接解决相邻边缘之间可能出现的间隙,但在解决这个问题时要灵活得多。一种解决方案可能涉及用另一个四边形桥接大角度线之间的顶点,我目前正在探索。

于 2012-10-04T04:12:17.157 回答
0

对于 iOS 设备来说,使用 z-buffer 的技术太复杂了——它需要大量的像素着色器,并且(恕我直言)它会带来一些视觉伪影。

如果您的模型不复杂,您可以在运行时找到几何轮廓 - 例如通过比较多边形的法线与公共边:如果视图空间中方向的 z 值具有不同的信号(一个法线指向相机,另一个来自相机)然后此边缘应用于轮廓。

另一种方法更“FPS 友好”:保留模型的挤压版本。并首先渲染具有轮廓颜色(没有纹理和照明)和正常模型的挤压模型。顶点需要更多内存,但不需要实时计算。

PS:在我看过的所有游戏中,剪影都是几何的。

于 2012-06-26T06:28:37.720 回答