【问题标题】:Using texture image with alpha makes mesh 'see through'使用带有 alpha 的纹理图像使网格“透视”
【发布时间】:2016-06-23 22:54:52
【问题描述】:

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

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

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

编辑:

我尝试了以下方法:

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

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

编辑 2:

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

透明度问题消失了,但我无法正常看到项链。

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

【问题讨论】:

  • 这似乎是一个严重的问题。如果您使用的是模拟器,则可能是原因,请在设备上尝试。由于您突然有了透明度,因此深度测试的工作方式会有所不同,因为仍然必须绘制透明对象后面的对象,以便您可以部分看到它。您的混合功能可能有点奇怪并且也导致了这种情况。
  • @MaticOblak 我在设备上。

标签: android opengl-es textures texture-mapping


【解决方案1】:

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

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

您可能只是在配件的边框上有一些半透明像素,其余的是1.00.0。所以可能是一个 pass,比如 if alpha < 0.5discard else 将 alpha 设置为 1.0

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

【讨论】:

  • 你真的认为这可能是问题,或者你建议我遵循这个解决方案,以防这实际上是问题?
  • 没有办法100%确定,但您可以分析您看到的结果。该模型在没有透明像素的情况下工作正常。一旦添加透明度,您不仅可以看到具有透明度的部分是错误的,而且整个模型绘制不正确。您所看到的是深度测试失败。所有这些额外的多边形都被正确绘制,但不尊重在它们之前绘制的东西。注意,连腿都是错的。我假设绘图与完全禁用深度缓冲区一样。您实际上可能会尝试这样做并将其与您的结果进行比较。
猜你喜欢
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2017-02-19
  • 1970-01-01
  • 2011-09-28
  • 2014-04-02
相关资源
最近更新 更多