替代默认的Open GLES线(3D)?

时间:2012-06-26 03:57:59

标签: iphone c++ opengl-es 3d

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

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

这个问题有很多方法 - 即定量不可见性。但是,考虑到需要采用光线投射,这种方法,特别是在具有有限处理能力的移动设备上,难以有效地实现。再看一些我发现this paper,它描述了使用z缓冲区采样来实现这种效果的几种方法。但是,我不是这方面的专家,虽然我在一定程度上理解了技术背后的理论,但我不确定如何进行实际实施。我想知道是否有人可以在技术层面上指导我 - 在OpenGLES方面。我也对任何有关3D线路可见度的建议持开放态度。

2 个答案:

答案 0 :(得分:0)

使用z-buffer的技术对于iOS设备来说太复杂了 - 它需要重像素着色器和(恕我直言)它会带来一些视觉瑕疵。

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

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

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

答案 1 :(得分:0)

我已经找到了一个在iPhone 4S上运行良好的解决方案(未在任何其他设备上测试过)。它建立在渲染世界空间四边形的基础上,并在GPU上进行轮廓检测。它按照这些方式工作(双关语并非意图):

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

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