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)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值