我有一个应该用于 alpha 混合或 alpha 测试的着色器,但传入的颜色值是预乘的 alpha 值。
在使用预乘 alpha 时,是否有一种简单/标准的方法可以让它为 alpha 混合和 alpha 测试产生“正确”的结果?
例如,如果我的着色器的最终结果是RGBA(1,0,0,0.75)
直接 alpha 并且因此是RGBA(0.75,0,0,0.75)
预乘 alpha,则结果应该RGBA(1,0,0,0.75)
在 alpha 测试时保留。
如果我们进行 alpha 测试,也许一种选择是“划分”alpha 通道,即除以R
上面的值A
,以便我们得到0.75/0.75 = 1.0
原始红色值。但是当 alpha 变为 0 时,这变得不确定。
假设后台缓冲区是RGBA(1,1,1,1)
,并且我正在使用部分透明的绿色RGBA(0,1,0,0.75)
(直接 alpha)进行渲染。颜色作为预乘 alpha 传入RGBA(0,0.75,0,0.75)
。当 alpha混合时,我使用 one + invsrcalpha 混合并获得最终颜色RGBA(0.25,1,0.25,1)
。所以我的绿色通道保持在 100%,因为后台缓冲区有 100% 的绿色,我原来的绿色也是如此,所以在绿色通道上没有办法低于 100%。
在进行Alpha测试时,不会进行混合。相反,我的绿色将作为RGBA(0,0.75,0,1)
. 但我想要的颜色是RGBA(0,1,0,1)
。