3

我有以下情况。我在 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);
4

1 回答 1

0

我找到了问题的根源。我的代码实际上是 100% 正确的。问题出在我用于测试的特定 DDS 纹理中。它已损坏。当我尝试不同的 DDS (DXT5) 时,它与 GL_NEAREST 和 GL_LINEAR 都可以正常工作过滤。要记住的重要细节是默认情况下不能预乘 DDS,因此如果需要,请在 GPU 上进行。

于 2012-11-09T15:34:36.537 回答