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