使用带 alpha 的纹理图像制作网格 'see through'
Using texture image with alpha makes mesh 'see through'
我在启用 Back-Culling 的 Android 上用 OpenGL ES 2.0 渲染一个 obj 文件。纹理图像只有一部分(脖子上的项链)实际上有 alpha。
仅渲染网格时,看起来不错:
但是,在启用纹理时,我能够透过网格看到另一侧。您可以在下面看到 body 后面的右手也变得可见。有什么想法可能会出错吗?
编辑:
我尝试了以下方法:
- Enabling/Disabling 背面剔除
- 检查顶点的顺序
- 在某些点检查法线是否在内部
但似乎没有任何效果。任何其他方向将不胜感激。
编辑 2:
我打开纹理图像并在图像编辑程序中将其保存为无 alpha 层,用黑色填充所有透明区域。这就是现在的样子:
透明度问题已经解决,但我将无法正确看到项链。
编辑 3:Alpha-blending and the Z-buffer 是否会成为 link 中描述的问题?它声称“Z 缓冲区不适用于透明多边形”。
对于深度缓冲区和alpha混合的冲突,有很多解决方案。
在您的情况下,最好简单地禁用混合并丢弃片段着色器中的像素。
您可能只是在配件的边框上有一些半透明像素,其余的是 1.0
或 0.0
。所以也许是一个传递,例如 if alpha < 0.5
discard else set alpha to 1.0
.
另一种方法是确保最后绘制这些混合对象。如果场景中只有一个这样的对象,它应该可以工作。但是如果你有多个一个在另一个后面,你可能会再次遇到问题。
我在启用 Back-Culling 的 Android 上用 OpenGL ES 2.0 渲染一个 obj 文件。纹理图像只有一部分(脖子上的项链)实际上有 alpha。
仅渲染网格时,看起来不错:
但是,在启用纹理时,我能够透过网格看到另一侧。您可以在下面看到 body 后面的右手也变得可见。有什么想法可能会出错吗?
编辑:
我尝试了以下方法:
- Enabling/Disabling 背面剔除
- 检查顶点的顺序
- 在某些点检查法线是否在内部
但似乎没有任何效果。任何其他方向将不胜感激。
编辑 2:
我打开纹理图像并在图像编辑程序中将其保存为无 alpha 层,用黑色填充所有透明区域。这就是现在的样子:
透明度问题已经解决,但我将无法正确看到项链。
编辑 3:Alpha-blending and the Z-buffer 是否会成为 link 中描述的问题?它声称“Z 缓冲区不适用于透明多边形”。
对于深度缓冲区和alpha混合的冲突,有很多解决方案。
在您的情况下,最好简单地禁用混合并丢弃片段着色器中的像素。
您可能只是在配件的边框上有一些半透明像素,其余的是 1.0
或 0.0
。所以也许是一个传递,例如 if alpha < 0.5
discard else set alpha to 1.0
.
另一种方法是确保最后绘制这些混合对象。如果场景中只有一个这样的对象,它应该可以工作。但是如果你有多个一个在另一个后面,你可能会再次遇到问题。