OpenGL 贴带透明度的纹理碰到的问题

使用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)


但是加载进来的图片是啥时候被Premultiplied Alpha?

你可能感兴趣的:(OpenGL 贴带透明度的纹理碰到的问题)