有人能解释一下为什么用预乘的alpha (和修正的混合函数)渲染看起来与“普通”alpha不同,而从数学上讲,它们是相同的?
为了理解预乘的alpha,我研究了这篇文章:
http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx
作者还说,最终的计算是相同的:
看看常规alpha与预乘alpha的混合方程。如果您将此颜色格式转换替换为预乘混合函数,则会得到常规混合函数,因此无论哪种方式都会产生相同的最终结果。不同之处在于,预乘alpha将(source.rgb *Soure.a)计算作为预处理而不是在混合硬件中应用。
我是不是遗漏了什么?为什么结果会不一样呢?
内斯霍恩
发布于 2019-01-15 00:03:20
不同之处在于过滤。
假设你有一个只有两个像素的纹理,并且你正好在两个像素之间的中间对它进行采样。还假设线性滤波。
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会产生正确的结果。
请注意,所有这些都与混合无关。
发布于 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在这两种情况下显示的值相匹配。
对于更深入的回复,我们需要的信息是。
< code >F210
发布于 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值),你会节省时间。我仍然需要找出这是不是真的,但似乎有一个原因,前阿尔法是首选的。
https://stackoverflow.com/questions/32889512
复制相似问题