我有一个着色器,可以使用alpha混合或alpha测试,但传入的颜色值是预乘alpha值。
使用预乘alpha时,是否有一种简单/标准的方法可以让alpha混合和alpha测试产生“正确”的结果?
例如,如果我的着色器的最终结果为RGBA(1,0,0,0.75)
直alpha并因此RGBA(0.75,0,0,0.75)
预乘alpha,则在进行alpha测试时结果应保持RGBA(1,0,0,0.75)
。
如果我们进行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 混合时,我使用一个+ invsrcalpha混合并获得RGBA(0.25,1,0.25,1)
的最终颜色。所以我的绿色通道保持在100%,因为背部缓冲区的绿色为100%,原来的绿色也是如此,因此无法在绿色通道上获得低于100%的效果。
当Alpha 测试时,没有进行混合。相反,我的绿色将直接渲染到后台缓冲区RGBA(0,0.75,0,1)
。但我想要的颜色是RGBA(0,1,0,1)
。