Premultiplied Alpha Blending

参考1:GPUs prefer premultiplication
参考2:Alpha Blending: To Pre or Not To Pre
参考3:WEBGL, BLENDING, AND WHY YOU’RE PROBABLY DOING IT WRONG
对于普通的rgba图片,rgb通道表示颜色,Alpha通道表示不透明度。比如一个半透明的红色像素,其颜色应该为(1,0,0,0.5)。在渲染中我们使用SrcAlpha OneMinusSrcAlpha的Blend Mode来实现半透明。
简单来说,Premultiplied Alpha Blending就是将半透明图片的RGB通道值预乘以alpha,即上述的像素将变为(0.5,0,0,0.5)。这个做法相当于将Blend Mode中SrcAlpha的系数乘法提前,且这个过程是对纹理数据进行的,发生在纹理采样之前。相应地,将Blend Mode从SrcAlpha OneMinusSrcAlpha改为One OneMinusSrcAlpha。
初看这似乎对颜色计算的结果并不会产生影响,只是将乘以alpha的过程提前了而已。但问题出在Texture Filtering和Mipmap上。考虑这样一种情况:采样uv坐标落在两个纹素正中间,这两个纹素一个颜色为(1,0,0,1),另一个为(0,1,0,0),且纹理采用双线性过滤。采样得到的结果是这两个纹素的插值结果(0.5,0.5,0,0.5)。
一个几乎透明到不可见的"绿色"纹素和一个几乎不透明的红色纹素对采样结果的颜色贡献是一样的,结果为一个半透明的黄色。这是不符合直觉的,我们希望不透明度高的颜色能够贡献更多权重,即我们希望采样结果更偏向红色。如果预乘了alpha,由于预乘是发生在纹理采样和插值之前的,能够根据不透明度调整纹素的插值权重,从而得到更理想的结果。如上述采样的结果就将变为(0.5,0,0,0.5),如我们所愿向红色偏移。

在实际情况中,一张图片透明区域(alpha=0)的RGB值通常也是0,即“透明的黑色”。如果图片有Mipmap,或Filter Mode不为Nearest,那么在透明和不透明区域的边缘,会有黑边出现,如上图所示。这和上述情况产生的原因是相同的,是因为“透明的黑色纹素”和不透明纹素对纹理采样结果做出了相同的贡献。预乘alpha可以解决这一问题。

Unity如何避免黑边

在Unity中,对于所有半透明图片,我们可以在Texture Inspector面板上勾选Alpha Is Transparency选项。这会使Unity对这些图片的RGB通道做特殊处理来避免Texture Filtering和Mipmap中的黑边产生。这个特殊处理并不是Alpha预乘,而是将不透明区域的RGB进行扩张,把位于不透明与透明区域边缘处的少量透明像素的RGB通道设置为临近不透明像素的RGB值。这样边缘处的不透明像素在纹理过滤或是计算Mipmap时,就会和扩张得到的相近的RGB混合,而不是和透明像素原先的黑色混合,从而避免黑边产生。(缺少相关资料,这段关于Unity做法的描述不一定准确)
因此,对于Alpha通道表示透明度的图片,我们均需要保证Alpha Is Transparency选项被开启。

【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边相关推荐

  1. 图像处理术语解释:灰度、色相、饱和度、亮度、明度、阿尔法通道、HSL、HSV、RGBA、ARGB和PRGBA以及Premultiplied Alpha(Alpha预乘)等基础概念详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 由于老猿以前没接触过图像处理,在阅读moviepy代码时,对类的有些处理方法代码看不懂是什么含义,为此花了4天时间查阅了大量资料,并加以自己的理解和 ...

  2. Alpha Blending a Bitmap 失败 原因

    AlphaBlend中目标DC的矩形范围设置错误,应为0,0,nWidth,nHeight: 另外参考微软MSDN源码: Alpha Blending a Bitmap This topic has ...

  3. opencv-python读取透明图片(既带alpha通道)

    opencv-python读取透明图片 透明图(alpha图) cv2 cv2.imread() 透明图(alpha图) 透明图是PS抠图中常用到的图片形式,能保存为png以及gif格式,相比于普通的 ...

  4. 什么是Alpha通道(Alpha Channel)

    如果图形卡具有32位总线,附加的8位信号就被用来保存不可见的透明度信号以方便处理用,这就是Alpha通道.白色的alpha象素用以定义不透明的彩色象素,而黑色的alpha象素用以定义透明象素,黑白之间 ...

  5. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  6. Python PIL Image 4通道透明图片叠加(ARGB)

    安装Package pip install Pillow pip install numpy RGBA与RGB的区别 一般图片(Jpeg)的呈现都是以3通道RGB显示出来 from PIL impor ...

  7. [pillow]透明图片和不透明图片叠加合成--添加透明度

    一开始尝试了网上各种方法,效果都不太好,边缘比较毛躁.目前试出来比较好的方法alpha_composite和paste 无透明度 #reference:https://blog.csdn.net/we ...

  8. html背景透明图片固定,请问在HTML中如何把一张图片的背景设定为透明的?

    请问在HTML中如何把一张图片的背景设定为透明的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 请问在HTML中如何把 ...

  9. 【OpenCV】opencv处理透明图片

    OpenCV处理透明图片,主要是考虑图片的叠加. //主函数操作 Mat dest,srcAlpha;//-1表示读取带有alpha通道的图片 srcAlpha = imread("1.pn ...

  10. Python3复制PNG透明图片到剪贴板

    Python 3 的 Pillow 模块是常用的图片处理库.Pillow 可以将图片以位图格式写入剪贴板中,但是对于有 Alpha 通道的图片(透明图片)也只能以位图格式写入剪贴板,这样会丢失 Alp ...

最新文章

  1. [LUOGU] 1090 合并果子
  2. Codeforces Round #276 (Div. 2)
  3. Imageloader1-总体简介
  4. mysql死锁场景汇总整理
  5. oracle重新编译package,如何有效的编译数据库中的失效对象(Package,trigger等)
  6. 带有示例的Python File readlines()方法
  7. python技巧(2)--碾平列表和列表去重
  8. LINQ语法之into
  9. 计算机应用综合实践课程报告,南通大学继续教育学院软件工程综合实践课程报告书——生产信息化工作管理系统...
  10. Splash 简介与安装
  11. 在VC++ 6.0下利用共享内存、消息实现内部进程通讯
  12. oracle sap 英克,中普审计软件内置350多个财务软件接口(新)-2015.9.16
  13. 二叉树遍历——递归算法
  14. 算数平均法和加权平均法
  15. 第二章 工具变量法(IV)与两阶段最小二乘法
  16. PHP基础学习第十四篇(了解和使用PHP的数据类型、常量、字符串变量、运算符)
  17. HDU - 6438 优先队列,+贪心。
  18. 【STM32F407的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵
  19. 使用阿里云ECS搭建基于Wordpress的个人网站
  20. 什么是启发式算法(转)

热门文章

  1. 为你的TabBar添加Badge-感谢分享
  2. 【ICML 2020联邦学习论文解读】SCAFFOLD: Stochastic Controlled Averaging for Federated Learning
  3. transforms的使用方法
  4. 蓝桥杯第八届省赛 电子钟 by YYC
  5. 爬取电影天堂的最新电影
  6. 学习July博文总结——支持向量机(SVM)的深入理解(下)
  7. linux服务器鼠标键盘没反应,Fedora 键盘鼠标输入没反应及解决办法
  8. Java的面向对象 -- 继承
  9. 练习 颈部肌肉重要性及锻炼方法
  10. (银行案例)智能营销赋能大零售转型