我有以下情况。我在 OpenGL 渲染器上工作(OpenGL 4.2 所以没有固定的东西)。由于与我在着色器中所做的各种图像效果相关的原因,我不使用硬件混合。我有两种类型的输入纹理:
1) 带有 alpha 通道的 PNG 24。2) 带 alpha 通道的 DDS (DXT5)。
在片段着色器中,我在输出之前预乘 alpha:
片段着色器:
outputColor=texture(colorMap,interpolateAtSample(uvsOut , gl_SampleID));
/////// PREMULTIPLY ALPHA //////////
outputColor.a *= alpha;
outputColor.rgb *= outputColor.a;
基于 PNG 的纹理工作正常:
但 DDS 看起来像这样:
你可以看到光晕+黑边。我认为的第一件事是 alpha 乘法的问题。但后来我将 DDS 的纹理过滤从 GL_LINEAR 更改为 GL_NEAREST,它同时删除了光晕和黑边。虽然这个“hack”基本上解决了这个问题,但我仍然想了解为什么 GL_LINEAR 会导致 DDS 压缩纹理出现此类问题。
差点忘了:如果我删除预乘,它可以解决 DDS 的问题,但会为基于 PNG 的纹理创建一个问题。
更新:在 MSAA 解析之后还有另一个通道,即混合通道。正如我所提到的,在这种情况下我不做任何混合,但混合着色器中的输出代码如下所示:
///Prevent background bleeding:
blendTex.rgb/=blendTex.a;
//base texture is the texture under the current one.
//This particular technique does "NORMAL" blend-just returns blendTex.
vec4 blendedRes=blendTechnique( baseTex , blendTex) ;
outputColor= vec4( blendedRes.rgb * blendTex.a, blendTex.a);