5

我有一个 iOS OpenGL ES 2.0 3D 游戏,并且正在努力让透明纹理正常工作,在这个特定的栅栏示例中。

我将从最终结果开始。绿色背景/清晰的颜色从栅栏的边缘穿过——注意它不是所有的边缘,其中一些是好的:

背景出血证据

右上角没有出血的原因是操作顺序。从下面的镜头中可以看出,绘制的顺序包括一些在围栏之前绘制的建筑物。但大部分是在围栏之后:

用深度绘制进度

因此,一种解决方案是始终最后绘制透明纹理对象。我想探索其他解决方案,因为我的管道可能并不总是允许这样做。我正在寻找其他建议来解决这个问题,而无需对我的抽奖进行排序。

这可能是一个深度或混合功能,但我尝试了很多东西,但似乎没有任何效果(不同的混合功能,不同的丢弃 alpha 级别,不同的背景颜色,不同的纹理设置)。

以下是我实施的一些细节。

在我的片段着色器中,我丢弃了具有透明度的片段 - 这样它们就不会渲染到深度:

lowp vec4 texVal = texture2D(sTexture, texCoord);
if(texVal.w < 0.5)
    discard;

我正在使用一个带有 mipmapping 的巨型 PVR 纹理图集 - 纹理本身应该只有 0 或 1 用于 alpha,但是混合的某些东西可能会导致这种情况:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

我在渲染时使用以下混合:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

任何修复这种出血的建议都会很棒!

编辑 - 为纹理尝试了不同的最小过滤器,如评论中建议的那样,LINEAR/NEAREST,但结果相同。注意我也尝试过 NEAREST/NEAREST 并且没有运气:

在此处输入图像描述

4

2 回答 2

1

尝试增加 alpha 过滤器限制,

lowp vec4 texVal = texture2D(sTexture, texCoord); if(texVal.w < 0.9) discard;

于 2013-03-19T06:33:34.013 回答
0

我知道这是一个老问题,但我在试图找到与我非常相似的 OpenGL 问题的答案时遇到了好几次。以为我会在这里为任何有类似情况的人分享我的发现。我的代码中的罪魁祸首是这样的:

glClearColor(1, 0, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);

我使用了粉红色的透明颜色,以便在调试时便于视觉参考。尽管它在背景和主题颜色之间混合时是透明的,但它会像问题截图中的症状一样渗入。为我解决的问题是包装此代码以掩盖 glClear 步骤。它看起来像这样:

glColorMask(false, false, false, true);
glClearColor(1, 0, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
glColorMask(true, true, true, true);

据我所知,这意味着当清除进程启动时,它仅在 Alpha 通道上运行。在这一切都重新启用以按预期继续该过程之后。如果对OpenGL有更深入了解的人可以更好地解释它,我很想听听!

于 2015-12-22T19:25:35.310 回答