三维网格的隐藏线移除算法?

Ari*_*lka 5 opengl graphics geometry

给定一个任意的3D网格,我正在寻找一种能够实时执行隐藏线删除的算法.我在OpenGL环境中工作,这意味着我们可以利用Z-Buffer.

我想该算法应包括以下两个问题的解决方案:

1)定义哪些是"硬边",以便稍后使用常规OpenGL线绘制它们.这些"硬边缘"应该对应于两个相应面之间的角度高于某个阈值的边缘.

为简单起见,让我们声明保证每条边定义的面数不超过2个.

"硬边"的计算应该每个网格进行一次,即它与视点无关.

2)根据当前视点定义网格轮廓的轮廓.最终,这部分可以使用经典的OpenGL技术(涉及多边形偏移或模板缓冲)来完成,但最好使用常规的OpenGL线绘制轮廓,以保持所有线条的统一外观.

对于那部分,我不确定轮廓的顶点是否应该都通过网格顶点.在任何情况下,对于像立方体这样的网格,其中不需要轮廓(因为它足以仅绘制"硬边缘")_算法应该足够智能以避免两次绘制"相似的线". .

Mik*_*ola 4

这里发生了一些事情。首先,您要绘制网格的线条,其次您要绘制轮廓。这是实现这项工作的通用程序,

  1. 仅通过清除颜色遮罩将(使用三角形)网格绘制到深度缓冲区。

  2. 重新打开颜色遮罩,切换正面,然后将网格重新缩放/偏移一些小百分比。翻转正面会使您只能看到偏移网格的内部,该网格会被先前绘制的网格的深度缓冲区剪切。如果你做得正确,它应该会给你一个整洁的轮廓。以下是此技术的示例:http://www.codeproject.com/KB/openGL/Outline_Mode.aspx

  3. 最后,在现有网格和外壳上绘制网格的边缘(同时保持前两个操作中深度缓冲区的完整性)。

结果是,您现在将绘制网格的所有边缘,以及漂亮的轮廓!

编辑:第二次重读您的帖子后,听起来您不想绘制所有边缘,而只想绘制那些出现在曲率足够高的边界处的边缘。因此,要执行此操作,您可以执行以下操作之一:

  1. 预处理网格的边缘,并剔除连接几乎共面的面对的所有边缘。只需比较其法线的点积即可轻松检查这一点。如果它足够接近 1,则从渲染集中丢弃该边。

  2. 更一般地说,您还可以近似计算屏幕空间中网格的曲率。这样做是计算所谓的屏幕空间环境光遮挡的逆过程。(这里列出了该技术的另一个巧妙应用: http ://zigguratvertigo.com/2011/03/07/gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look / ) 一旦从深度缓冲区计算出对象的曲率,您就可以通过仅绘制曲率足够高的像素上出现的线片段来过滤掉线。