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?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.OpenGLES提供了一个为几何图形中的每个顶点设置不同颜色的方法。 2.纹理可以控制一个渲染的三角形中的每个...
    碧玉小瑕阅读 3,101评论 0 0
  • 混合 在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明的物体(或物体的一部分)非纯色而是混合...
    IceMJ阅读 8,344评论 1 4
  • 什么是纹理 纹理是一个用来保存图像的颜色色素值得OpenGL ES缓存, 纹理的作用是为了使我们渲染的几何图像更加...
    冰三尺阅读 3,971评论 0 1
  • 对于一幅图像来说,可以看做是一个二维像素点的矩阵。剪纸效果的纹理贴图是指一张图片有的像素点正常显示,有的像素点则不...
    zyl06阅读 4,030评论 0 0
  • 纹理 纹理是用来保存图像颜色元素之的OpenGL ES 缓存.当用一个图像初始化一个纹理缓存之后,在这个图像的中的...
    蝼蚁撼树阅读 4,200评论 0 1