我有以下情况。我使用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乘法的问题,但是后来我改变了
从GL_LINEAR到GL_NEAREST的DDS的纹理过滤,它同时去除了光晕和黑色边缘。
尽管此“ 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);

最佳答案

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

09-07 06:33