使用OpenGL貼紋理時(shí),圖片是一張周邊帶有漸變透明度的圖,顯示出來(lái)后圖片透明度的地方顯示是灰黑色。采用的顏色混合方法是:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)。因?yàn)橛眠@個(gè)來(lái)處理半透明的圖像,則ColorResult = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha),這時(shí)SrcAlpha就剛好被解析為透明度了。
但是實(shí)際中在繪制一張半透明的png圖片時(shí),半透的地方都變灰了。查到的原因是在加載圖像時(shí)使用Premultiplied Alpha所致。
Premultiplied Alpha是預(yù)先將RGBA中A通道,分配給顏色通道。經(jīng)過(guò)Premultiplied Alpha處理之后,所有的顏色通道都會(huì)乘以alpha因子。實(shí)際上Premultiplied Alpha所作的便是 SrcColor1 = SrcColor0 * SrcAlpha操作。這樣一來(lái),半透明混合所要做的操作就應(yīng)該是:ColorResult = SrcColor1 + DstColor * (1 - SrcAlpha).
即顏色混合方式是:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)