首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释预乘alpha的工作原理

解释预乘alpha的工作原理
EN

Stack Overflow用户
提问于 2015-10-01 21:58:22
回答 3查看 2K关注 0票数 2

有人能解释一下为什么用预乘的alpha (和修正的混合函数)渲染看起来与“普通”alpha不同,而从数学上讲,它们是相同的?

为了理解预乘的alpha,我研究了这篇文章:

http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx

作者还说,最终的计算是相同的:

看看常规alpha与预乘alpha的混合方程。如果您将此颜色格式转换替换为预乘混合函数,则会得到常规混合函数,因此无论哪种方式都会产生相同的最终结果。不同之处在于,预乘alpha将(source.rgb *Soure.a)计算作为预处理而不是在混合硬件中应用。

我是不是遗漏了什么?为什么结果会不一样呢?

内斯霍恩

EN

回答 3

Stack Overflow用户

发布于 2019-01-15 00:03:20

不同之处在于过滤。

假设你有一个只有两个像素的纹理,并且你正好在两个像素之间的中间对它进行采样。还假设线性滤波。

代码语言:javascript
复制
Schematically:
R|G|B|A + R|G|B|A = R|G|B|A
non-premultiplied:
1|0|0|1 + 0|1|0|0 = 0.5|0.5|0|0.5
premultiplied:
1|0|0|1 + 0|0|0|0 = 0.5|0|0|0.5

请注意绿色通道中的差异。过滤预乘的alpha会产生正确的结果。

请注意,所有这些都与混合无关。

票数 5
EN

Stack Overflow用户

发布于 2015-12-10 07:09:18

这只是一个猜测,因为目前还没有足够的信息来解决这个问题。

它应该是一样的。获得不同值的一种常见方法是在预乘和渲染步骤之间使用不同的Gamma校正方法。

我会猜测你的其中一个阶段,要么是混合阶段,要么是预乘阶段,是用不同的伽马值完成的。如果使用srgb texconv等工具生成预乘纹理,并使用默认的DirectXTex选项预乘alpha,则采样器需要为_SRGB格式,渲染目标也应为_SRGB。如果对它们进行线性处理,则可能无法渲染到_SRGB目标或使用gamma校正对纹理进行采样,即使您在采样的同一着色器中执行预乘(取决于3D API和渲染目标设置的差异)。这样做将导致两种方法在中间色调中的alpha明显不同。

请参阅:The Importance of Being Linear

如果你在Photoshop中生成alpha,那么你应该知道几件事。Photoshop不以线性或sRGB格式存储alpha。它将其另存为介于线性和sRGB之间的伽马值。如果你在Photoshop中预乘,它将正确地计算预乘,但用错误的渐变保存结果。如果你生成一个正常的alpha,然后在你的3DAPI中将其采样为sRGB或线性,它将是接近的,但不会与Photoshop在这两种情况下显示的值相匹配。

对于更深入的回复,我们需要的信息是。

  • 您使用的是什么3d API。
  • 您的纹理是如何生成和采样的
  • 何时以及如何预乘alpha。
  • ,最好是显示错误的代码或着色器示例。

< code >F210

票数 2
EN

Stack Overflow用户

发布于 2015-12-24 03:35:26

我正在研究为什么人们会使用Pre和非Pre,并从Nvidia发现了这个有趣的信息

https://developer.nvidia.com/content/alpha-blending-pre-or-not-pre

似乎他们的具体情况在使用Pre时比使用Post-Alpha时更精确。

我也读到(我相信在这里,但找不到),做pre-alpha (将Alpha乘以每个RGB值),你会节省时间。我仍然需要找出这是不是真的,但似乎有一个原因,前阿尔法是首选的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32889512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档