我有以下情况。我在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纹理过滤,它删除了光晕和黑边。 虽然这个“黑客”基本上解决了这个问题,但我仍然想了解为什么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);
答案 0 :(得分:0)
我找到了问题的根源。我的代码实际上是正确的100%。问题出在我用于测试的特定DDS纹理中。它已损坏。当我尝试不同的DDS(DXT5)时,它的工作正常GL_NEAREST和GL_LINEAR过滤。要记住的重要细节是DDS默认情况下不能预先乘以,所以如果需要它,请在GPU上进行。