作者:John McDonald,于2013年1月31日上午07:57发布
标签: 
GameWorks专家开发人员

Alpha Blending几乎是每个3D应用程序的一小部分,但却很重要。从概念上讲,alpha混合用于传达表面的透明度。通常,消费者应用程序(游戏)倾向于使用RGB来传达下层表面的颜色,依赖于alpha通道来指示该颜色的“不透明度”。更具体地说,当在管道中启用alpha混合时,开发人员倾向于使用此表单进行混合:

DestinationColor.rgb = (SourceColor.rgb * SourceColor.a) + (DestinationColor.rgb * (1 - SourceColor.a));

在旧的,固定的功能中,这将被称为“SourceAlpha,InvSourceAlpha”; 也被称为“后倍增α”。然而,这种形式的alpha混合存在一个严重的缺陷:在许多情况下它会导致错误的颜色!最简单的这些情况可以通过一个简单的双像素图像来说明:

一个红色像素,红色= 1,alpha为1,绿色像素为绿色= 1,alpha为0.10

考虑上面的图像,其分辨率为2x1像素。艺术家想要传达的是,在绿色像素旁边有一个红色的不透明像素,它只会给它背后的物体带来最轻微的绿色。但是,当我们生成下一个mipmap级别1x1级别时会发生一些有趣的事情。结果可能令人惊讶; 生成的mipmapped纹素是这样的:

RGBA =(0.5,0.5,0,0.55)

当我们接近这个mipmap级别时,我们将获得与使用2x1级别时非常不同的结果 - 完全是因为我们决定使用postmultiplied级别。您可以在以下图片中看到这一点:

规范图像测试“mandrill”的三个版本。第一个,原始的mandrill。第二个包含与我们的2x1图像混合时的mandrill,最后一个与2x1纹理的1x1 mipmap混合。

输入预乘的alpha

使用预乘的alpha,我们在存储之前首先将纹理组件乘以alpha组件。我们还修改了混合函数,将SourceColor.a更改为One:

DestinationColor.rgb = (SourceColor.rgb * One) + (DestinationColor.rgb * (1 - SourceColor.a));

使用预乘的alpha,我们的原始纹理看起来像这样:

我们的2x1纹理,准备好预乘alpha。R =(1,0,0,1),G =(0,0.1,0,0.1)

此纹理的1x1 mipmap级别如下所示:

我们预乘的alpha纹理的1x1 mipmap。RGBA =(0.5,0.05,0,0.55)

这是很多更合理。我们仍然丢失了一些信息(请注意,如果绿色组件足够小,或者如果我们的精度太低,绿色将完全消失),但我们保留了更高分辨率的mipmap的意图。为了比较,这里再次是图像,增加了我们的预乘混合器:


   
所有版本的mandrill。从上到下的顺序,原始的mandrill,原始的mandrill由我们的预乘α2x1覆盖,后乘α2x1,预乘1x1,最后是后乘1x1。

从我们的后乘世界过渡

方便地,从后乘的α管道到利用预乘的α的管道的转换是微不足道的。在纹理保存时间或资产烘焙时间,甚至加载时间,将每个非alpha通道乘以alpha。那是:

OutputTexture.rgb = InputTexture.rgb * InputTexture.a; OutputTexture.a = InputTexture.a;

并且不要忘记修改“alpha混合启用”以使用One作为Source Alpha值。如果我们将预乘的alpha插入到原始混合方程中,很容易看到切换到预乘的alpha会给出完全相同的结果:

DestinationColor.rgb = ((SourceColor.rgb * SourceColor.a) * One) + (DestinationColor.rgb * (1 - SourceColor.a));

所以你可能会问:如果结果相同,为什么还要加倍预乘?原因是纹理过滤。从纹理中获取样本时,除非已禁用纹理过滤,否则硬件会将相邻纹理像素混合在一起并返回加权平均值作为结果。使用传统的后乘法alpha,此结果将不正确。

原文地址:https://developer.nvidia.com/content/alpha-blending-pre-or-not-pre

转载于:https://www.cnblogs.com/xiaonanxia/p/9448383.html

Alpha预乘-混合与不混合[转]相关推荐

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

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

  2. 金融知识杂记(三)顺周期板块?最大回撤?主动型基金VS被动型基金?基金混合A和混合C的区别?ETF,LOF基金?基金持仓作业

    目录 顺周期板块 哪些行业属于顺周期板块呢? 顺周期板块的投资价值 最大回撤 主动型基金VS被动型基金 主动型基金和被动型基金区别 基金混合A和混合C的区别 ETF,LOF基金 4月份基金持仓作业 顺 ...

  3. scala java混合_Scala特性混合

    scala java混合 Scala | 特性混合 (Scala | Trait Mixins ) In Scala, the number of traits can be extended usi ...

  4. python中alpha是什么意思_图像处理术语解释:什么是PRGBA和Alpha预乘(Premultiplied Alpha )...

    Alpha预乘(Premultiplied Alpha)和PRGBA 一般来说四通道图像数据保存的都是ARGB或RGBA,其R.G.B值还没有进行任何透明化处理,但这种格式在图像合成时会存在两个问题: ...

  5. 图片正常模式混合(透明度混合)公式

    一.描述 所有内容摘自维基 在处理图象时可能需要手撸图片混合的代码,此时混合公式就十分重要.而正常混合(Normal Blending)模式是最常用的一种格式(比如PS的默认图层混合模式).想手动实现 ...

  6. 图片Alpha预乘的作用[转]

    Premultiplied Alpha 这个概念做游戏开发的人都不会不知道.Xcode 的工程选项里有一项 Compress PNG Files,会对 PNG 进行 Premultiplied Alp ...

  7. 【opencv4】opencv视频教程 C++ 6、图像混合、线性混合、混合权重相加addWeighted()、混合加add()、混合乘multiply()

    上一讲:[opencv4]opencv视频教程 C++ 5.读写图像imread.imwrite.读写像素at<>().修改像素值.ROI区域选择(图像裁剪)Rect.Vec3b与Vec3 ...

  8. 公有云 私有云 混合云_混合云的承诺,收益和产品

    公有云 私有云 混合云 云承诺为我们提供所有灵活性. 有机会在需要时访问无限资源并相应地付款. 我们不再需要花费时间安装,配置和维护服务器: 我们被承诺将有更多的时间来"仅仅编码" ...

  9. jemeter多场景混合案例_Redis 混合存储最佳实践指南

    Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...

最新文章

  1. RedHat Enterprise 5.1下OpenLDAP的配置及PAMNSS的配置
  2. Internet Explorer7.0订阅“源”
  3. Node.js 应用的内存泄漏问题的检测方法
  4. Asp.Net.Core WebApi 版本控制
  5. Last_Error: Slave SQL thread retried transaction 10 time(s) in vain, giving up导致主从不同步的解决方法
  6. linux下的正则表达式
  7. error: R_LARCH_SOP_PUSH_PCREL against `x264_log_default‘:PLT shouldn‘t be with r_addend.
  8. hua图软件 mac_10款Mac上设计师必备的设计绘图工具推荐和下载 | 玩转苹果
  9. Unity3D--用2D图片实现3D轮转图
  10. 树莓派入门笔记(七)用Vlmcsd搭建Kms服务---2020-03-28 (1113)
  11. 在web of science / 知网 上生成题录
  12. mysql表名、字段名命名规范
  13. j2se学习笔记-Enum枚举类型
  14. 复变|第一章 复数与复变函数 复数
  15. 使用Spring Boot + Resilience 4j实现断路器
  16. DustBot机器人
  17. 头歌-信息安全技术-【实训10】HTML信息隐藏、动态分析技术
  18. 如何保证数据在传输过程中的安全
  19. Oracle图书管理系统
  20. AC/DC、DC/DC转换器知识

热门文章

  1. 【收藏】docker的privileged 与 k8s的privileged 设置方式
  2. 【收藏】go博客 zxysilent / blog
  3. Java Object中的clone方法
  4. Python3字符串的编码
  5. Pyhon爬虫开发:URLError的使用
  6. 请解释为什么集合类没有实现Cloneable和Serializable接口?
  7. Mysql 8.0下载与安装详解,并修改安装路径
  8. java成绩管理系统论文总结,JAVA论文成绩管理系统课程设计
  9. 【精简解释】Java中native关键字作用
  10. 清除浏览器某一特定网站的缓存(Microsoft Edge、Chrome等)