我有一个iOS OpenGL ES 2.0 3D游戏,并且正在努力使透明纹理正常工作,在这个特殊的示例中。 我将从最终结果开始。绿色背景/透明颜色的钻头在围栏的边缘周围遍布 - 注意它不是全部的边缘,其中一些还可以:
右上角缺乏流血的原因是操作顺序。从以下镜头中可以看到,抽签的顺序包括一些在栅栏之前被绘制的建筑物。但是大部分是在栅栏之后:
因此,一种解决方案是始终绘制我的透明纹理对象。我想探索其他解决方案,因为我的管道可能并不总是允许这样做。我正在寻找其他建议来解决此问题而不对我进行分类。
这可能是一个深度或混合功能,但是我尝试了很多东西,似乎没有用(不同的混合功能,不同的丢弃alpha级别,不同的背景颜色,不同的纹理设置)。
在我的碎片着色器中,我要抛出具有透明度的片段 - 这样它们就不会呈现到深度:
lowp vec4 texVal = texture2D(sTexture, texCoord);
if(texVal.w < 0.5)
discard;
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;
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);