【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边
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预乘/透明图片黑边相关推荐
- 图像处理术语解释:灰度、色相、饱和度、亮度、明度、阿尔法通道、HSL、HSV、RGBA、ARGB和PRGBA以及Premultiplied Alpha(Alpha预乘)等基础概念详解
☞ ░ 前往老猿Python博文目录 ░ 一.引言 由于老猿以前没接触过图像处理,在阅读moviepy代码时,对类的有些处理方法代码看不懂是什么含义,为此花了4天时间查阅了大量资料,并加以自己的理解和 ...
- Alpha Blending a Bitmap 失败 原因
AlphaBlend中目标DC的矩形范围设置错误,应为0,0,nWidth,nHeight: 另外参考微软MSDN源码: Alpha Blending a Bitmap This topic has ...
- opencv-python读取透明图片(既带alpha通道)
opencv-python读取透明图片 透明图(alpha图) cv2 cv2.imread() 透明图(alpha图) 透明图是PS抠图中常用到的图片形式,能保存为png以及gif格式,相比于普通的 ...
- 什么是Alpha通道(Alpha Channel)
如果图形卡具有32位总线,附加的8位信号就被用来保存不可见的透明度信号以方便处理用,这就是Alpha通道.白色的alpha象素用以定义不透明的彩色象素,而黑色的alpha象素用以定义透明象素,黑白之间 ...
- 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备
孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...
- Python PIL Image 4通道透明图片叠加(ARGB)
安装Package pip install Pillow pip install numpy RGBA与RGB的区别 一般图片(Jpeg)的呈现都是以3通道RGB显示出来 from PIL impor ...
- [pillow]透明图片和不透明图片叠加合成--添加透明度
一开始尝试了网上各种方法,效果都不太好,边缘比较毛躁.目前试出来比较好的方法alpha_composite和paste 无透明度 #reference:https://blog.csdn.net/we ...
- html背景透明图片固定,请问在HTML中如何把一张图片的背景设定为透明的?
请问在HTML中如何把一张图片的背景设定为透明的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 请问在HTML中如何把 ...
- 【OpenCV】opencv处理透明图片
OpenCV处理透明图片,主要是考虑图片的叠加. //主函数操作 Mat dest,srcAlpha;//-1表示读取带有alpha通道的图片 srcAlpha = imread("1.pn ...
- Python3复制PNG透明图片到剪贴板
Python 3 的 Pillow 模块是常用的图片处理库.Pillow 可以将图片以位图格式写入剪贴板中,但是对于有 Alpha 通道的图片(透明图片)也只能以位图格式写入剪贴板,这样会丢失 Alp ...
最新文章
- [LUOGU] 1090 合并果子
- Codeforces Round #276 (Div. 2)
- Imageloader1-总体简介
- mysql死锁场景汇总整理
- oracle重新编译package,如何有效的编译数据库中的失效对象(Package,trigger等)
- 带有示例的Python File readlines()方法
- python技巧(2)--碾平列表和列表去重
- LINQ语法之into
- 计算机应用综合实践课程报告,南通大学继续教育学院软件工程综合实践课程报告书——生产信息化工作管理系统...
- Splash 简介与安装
- 在VC++ 6.0下利用共享内存、消息实现内部进程通讯
- oracle sap 英克,中普审计软件内置350多个财务软件接口(新)-2015.9.16
- 二叉树遍历——递归算法
- 算数平均法和加权平均法
- 第二章 工具变量法(IV)与两阶段最小二乘法
- PHP基础学习第十四篇(了解和使用PHP的数据类型、常量、字符串变量、运算符)
- HDU - 6438 优先队列,+贪心。
- 【STM32F407的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵
- 使用阿里云ECS搭建基于Wordpress的个人网站
- 什么是启发式算法(转)