博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OPENGL半透明图像产生黑色光环
阅读量:6153 次
发布时间:2019-06-21

本文共 928 字,大约阅读时间需要 3 分钟。

OPENGL提供了多种多样的混合方法,我们很容易就能实现诸如 叠加、变亮等图像混合。

我们知道一般带透明度的图像是RGBA四个通道来存储,最常的glBlendFunc是

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

大多数的资料会告诉要用这个来处理半透明的图像,因为:

  ColorResult = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha).

这时SrcAlpha就刚好被解析为透明度了。

 

但是实际中我们可能会发现大多情况下在绘制一张半透明的png图片时,半透的地方都变灰了。

如果你查看你加载的PNG图像数据,会发现原本在ps中显示为:

0xffffffFF, 0xffffff77, 0xffffff00

的像素,加载进来时变成了:

0xffffffFF, 0x77777777, 0x00000000

 

这便是你在加载图像时使用Premultiplied Alpha所致。Premultiplied Alpha是预先将RGBA中A通道,分配给颜色通道。

如三个RGBA值,实际值为:

(1.0,0.5, 0.0, 1.0)

(1.0,0.5, 0.0, 0.5)

(1.0,0.5, 0.0, 0.0)

经过Premultiplied Alpha处理之后,会表示为:

(1.0,0.5, 0.0, 1.0)

(0.5,0.25, 0.0, 0.5)

(0.0,0.0, 0.0, 0.0)

 

所有的颜色通道都会乘以alpha因子。实际上Premultiplied Alpha所作的便是 SrcColor1 = SrcColor0 * SrcAlpha操作。

这样一来,半透明混合所要做的操作就应该是:

ColorResult = SrcColor1 + DstColor * (1 - SrcAlpha).

 

即是:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

 

转载于:https://www.cnblogs.com/leaving/p/OpenGL_Premultiplied_Alpha.html

你可能感兴趣的文章
c#中lock的使用(用于预约超出限额的流程)
查看>>
ODI基于源表时间戳字段获取增量数据
查看>>
并发容器之CopyOnWriteArrayList(转载)
查看>>
什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么
查看>>
原创:goldengate从11.2升级到12.1.2
查看>>
Quartz
查看>>
正则表达式的语法规则
查看>>
C#一个关于委托和事件通俗易懂的例子
查看>>
类似于SVN的文档内容差异对比工具winmerge
查看>>
Cause: java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
查看>>
quratz线程
查看>>
execnet: rapid multi-Python deployment
查看>>
windows修改3389端口
查看>>
关于JavaScript词法
查看>>
FreeSwitch中的会议功能(4)
查看>>
MySQL中创建用户分配权限(到指定数据库或者指定数据库表中)
查看>>
IL指令详细
查看>>
POJ 2406
查看>>
button按钮在IE中的宽度
查看>>
1-17的代码
查看>>