GLSL中的OpenGL预乘alpha给DDS纹理带来了意想不到的结果

时间:2012-10-30 10:43:22

标签: opengl glsl

我有以下情况。我在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的纹理工作正常: enter image description here

但DDS看起来像这样: enter image description here

你可以看到晕+黑边。 首先我想到的是alpha乘法的问题。然后我改变了 从GL_LINEAR到GL_NEAREST的DDS纹理过滤,它删除了光晕和黑边。 虽然这个“黑客”基本上解决了这个问题,但我仍然想了解为什么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);

1 个答案:

答案 0 :(得分:0)

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