使用纹理图像与alpha使网格'透视'

时间:2016-03-09 14:02:20

标签: android opengl-es textures texture-mapping

我在Android上使用Back-Culling在OpenGL ES 2.0中渲染obj文件。只有纹理图像的某些部分(脖子上的项链)实际上有alpha。

当仅渲染网格时,它看起来很好:

enter image description here

然而,在启用纹理时,我能够透过网格看到另一边。你可以在下面看到身体后面的右手也变得可见。什么想法可能会出错?

enter image description here

编辑:

我尝试了以下内容:

  1. 启用/禁用背面剔除
  2. 检查顶点的排序
  3. 检查法线是否在某些点内部
  4. 但似乎没有任何效果。任何其他方向将不胜感激。

    编辑2:

    我打开了纹理图像并通过在图像编辑程序中将其保存为无alpha图层来填充所有透明区域的黑色。这就是它现在的样子:

    enter image description here

    透明度问题已经消失,但我无法正确看到项链。

    编辑3:链接中描述的Alpha-blending and the Z-buffer是否可以成为问题?它声称'Z缓冲区不适用于透明多边形。'

1 个答案:

答案 0 :(得分:1)

深度缓冲和alpha混合的冲突有很多解决方案。

在您的情况下,最好只是禁用混合并丢弃片段着色器中的像素。

您可能在附件的边框上只有一些半透明像素,其余部分为1.00.0。因此,如果alpha < 0.5丢弃其他设置为1.0,则可能会传递。

另一种方法是确保最后绘制这些混合对象。如果你在场景中只有一个这样的对象它应该工作。但如果你有多个一个在另一个后面,你可能会再次遇到问题。