如何停止在透明纹理上流血的OpenGL背景

问题描述 投票:0回答:2

我有一个iOS OpenGL ES 2.0 3D游戏,并且正在努力使透明纹理正常工作,在这个特殊的示例中。 我将从最终结果开始。绿色背景/透明颜色的钻头在围栏的边缘周围遍布 - 注意它不是全部的边缘,其中一些还可以:

Background bleed evidence右上角缺乏流血的原因是操作顺序。从以下镜头中可以看到,抽签的顺序包括一些在栅栏之前被绘制的建筑物。但是大部分是在栅栏之后:

因此,一种解决方案是始终绘制我的透明纹理对象。我想探索其他解决方案,因为我的管道可能并不总是允许这样做。我正在寻找其他建议来解决此问题而不对我进行分类。 Draw progression with depth这可能是一个深度或混合功能,但是我尝试了很多东西,似乎没有用(不同的混合功能,不同的丢弃alpha级别,不同的背景颜色,不同的纹理设置)。

在这里是我实施的一些细节。

在我的碎片着色器中,我要抛出具有透明度的片段 - 这样它们就不会呈现到深度:

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

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

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

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

任何解决此流血的建议都很棒!

Edit-根据注释中建议的纹理尝试了不同的最小过滤器,即线性/最近但结果相同。请注意,我还尝试过最近/最近,没有运气:

    

trory增加α滤波器极限,

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

enter image description here

我知道这是一个古老的问题,但是我几次遇到了它,同时试图找到我非常相似的OpenGL问题的答案。以为我会在这里为任何类似的人分享我的发现。我的代码中的罪魁祸首看起来像这样:
opengl-es-2.0 transparency
2个回答
1
投票
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);

0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.