使用带 alpha 的纹理图像制作网格 'see through'

Using texture image with alpha makes mesh 'see through'

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

仅渲染网格时,看起来不错:

但是,在启用纹理时,我能够透过网格看到另一侧。您可以在下面看到 body 后面的右手也变得可见。有什么想法可能会出错吗?

编辑:

我尝试了以下方法:

  1. Enabling/Disabling 背面剔除
  2. 检查顶点的顺序
  3. 在某些点检查法线是否在内部

但似乎没有任何效果。任何其他方向将不胜感激。

编辑 2:

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

透明度问题已经解决,但我将无法正确看到项链。

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

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

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

您可能只是在配件的边框上有一些半透明像素,其余的是 1.00.0。所以也许是一个传递,例如 if alpha < 0.5 discard else set alpha to 1.0.

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