使用OpenGL贴纹理时,图片是一张周边带有渐变透明度的图,显示出来后图片透明度的地方显示是灰黑色。采用的颜色混合方法是:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)。因为用这个来处理半透明的图像,则ColorResult = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha),这时SrcAlpha就刚好被解析为透明度了。
但是实际中在绘制一张半透明的png图片时,半透的地方都变灰了。查到的原因是在加载图像时使用Premultiplied Alpha所致。
Premultiplied Alpha是预先将RGBA中A通道,分配给颜色通道。经过Premultiplied Alpha处理之后,所有的颜色通道都会乘以alpha因子。实际上Premultiplied Alpha所作的便是 SrcColor1 = SrcColor0 * SrcAlpha操作。这样一来,半透明混合所要做的操作就应该是:ColorResult = SrcColor1 + DstColor * (1 - SrcAlpha).
即颜色混合方式是:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)