opengl 关于png带黑边的原因

网上有很多关于png带黑边的解决方法就是混合模式改成glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);可是没有人说为啥会出现这个问题,然后我就被坑死了。

公司里有专门做图片的部门,然后他们用的软件是不一样的,一些人做出来的png用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);是带黑边的,问他们呢他们自己也不知道原因,还说是我的问题,没办法,改吧。改成glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);后呢没有了黑边,可那些原来正常的png却出现了白边。。和他们说呢又说不清楚,我也不懂做图片的东西,就很烦,为了找原因连ps都用上了,一个一个的像素进行对比,那群做图的就只会说那是你的问题,烦死了啊。

好了,发牢骚就到这了,原因呢就是这篇文章解决三维出图黑白边缘溢出问题:直通(straight)与预乘(premult)alpha剖析

通过这篇文章我才知道png的透明有两种计算方法一种叫做直通alpha(straight alpha),一种叫做预乘alpha(premultiplied alpha),和三维没啥关系,看做图的有没有做预乘这一步。简单来说预乘alpha做的png要用glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);来混合才不会有黑边,而直通alpha要用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);来进行混合。问题找到了,可是程序上是没法判断哪个是预乘哪个是直通,所以就要他们统一透明方法

最后对比glBlendFunc的参数和png的alpha显示公式就可以发现它们是一样的显示方法

GL_ONE: 表示使用1.0作为因子

GL_SRC_ALPHA: 表示使用源颜色的alpha值来作为因子

GL_ONE_MINUS_SRC_ALPHA: 表示用1.0减去源颜色的alpha值来作为因子

预乘: result=A+B*(1-alpha)

直通: result = A*alpha +B*(1-alpha)

你可能感兴趣的:(opengl)