在opengles中删除3d模型的隐藏顶点

时间:2016-03-23 05:21:49

标签: algorithm graphics opengl-es

我有一个3d人形模型,我可以在上面定位一件衬衫的模型。在这种状态下,opengl渲染具有典型的z-fighting问题。我发现唯一的解决方案是防止隐藏顶点渲染。有没有办法自动防止隐藏顶点渲染或任何算法删除隐藏顶点

2 个答案:

答案 0 :(得分:2)

一种相对简单的方法是使用模板缓冲区。这个想法很简单。首先使用glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)glStencilFunc(GL_ALWAYS, 1, 1)绘制衬衫。无论你在哪里画衬衫,这都会在模板缓冲区中设置一下。然后使用glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP)glStencilFunc(GL_NOTEQUAL, 1, 1)绘制模型。只有当它没有触摸已经由衬衫绘制的像素时,才会绘制模型。

关于缺点的说明:您可能需要对模型进行分段并将其仅应用于您希望遇到问题的部分(比如躯干),否则该技术会遮挡模型的其他部分,这些部分将覆盖衬衫(说武器)。为了达到最佳效果,请务必剔除衬衫的背面。

答案 1 :(得分:1)

如果它是真正的z-fighting,即由于精度变化而在前面出现的相同深度的不同面部或多或少随机每个像素,也考虑{ {1}}解决方案 - 在绘制衬衫之前启用glPolygonOffset并调用GL_POLYGON_OFFSET_FILL(或者如果您愿意,可以使用其他参数; glPolygonOffset(1.0, 1.0)是死记硬背)。在禁用偏移填充或遵循具有相同效果的1.0之后绘制正文。

多边形偏移用于在进行深度测试之前轻微触摸某些几何体的深度值。所以这或多或少地说,你给予偏移的东西也应该在前面,只要它与没有偏移的东西相同或仅略微落后。