首页 文章

GLSL中的OpenGL预乘alpha给出了DDS纹理的意外结果

提问于
浏览
2

我有以下情况 . 我在使用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乘法的问题 . 然后我将DDS的纹理过滤从GL_LINEAR更改为GL_NEAREST,它删除了光晕和黑边 . 虽然这个“黑客”基本上解决了这个问题,但我仍然想了解为什么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

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

相关问题