如何在透明纹理上停止OpenGL背景渗色

mob*_*bob 5 transparency opengl-es-2.0

我有一个iOS OpenGL ES 2.0 3D游戏,我正在努力让透明纹理很好地工作,在这个特殊的栅栏示例中.

我将从最终结果开始.绿色背景/清晰的颜色在围栏的边缘穿过 - 注意它不是所有的边缘,有些是好的:

背景流血证据

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

随深度绘制进展

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

这可能是一个深度或混合功能,但我已经尝试了大量的东西,似乎没有任何工作(不同的混合功能,不同的丢弃alpha级别,不同的背景颜色,不同的纹理设置).

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

在我的frag shader中,我丢弃了具有透明度的碎片 - 这样它们就不会渲染到深度:

lowp vec4 texVal = texture2D(sTexture, texCoord);
if(texVal.w < 0.5)
    discard;
Run Code Online (Sandbox Code Playgroud)

我正在使用一个巨大的PVR纹理图集和mipmapping - 纹理本身应该只有0或1的alpha,但混合的东西可能导致这个:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
Run Code Online (Sandbox Code Playgroud)

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

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

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

编辑 - 根据注释LINEAR/NEAREST中的建议尝试了不同的纹理过滤器,但结果相同.注意我也尝试过NEAREST/NEAREST并且没有运气:

在此输入图像描述