在小的alpha值上错误地混合OpenGL

时间:2016-08-27 09:49:50

标签: opengl pixel blend alphablending blending

我从纹理中画出了许多白色的细纹。但是当它绘制在黄色圆圈上时,包含小的alpha值(但不等于0)的点被混合错误,并且我在屏幕上得到一些较暗的像素(参见屏幕截图,它被放大了)。哪个可能是问题? 在蓝色背景上都可以。

screenshot

1 个答案:

答案 0 :(得分:1)

正如@tklausi在评论中指出的那样,这个问题与纹理插值结合传统的alpha混合有关。在从高alpha值到"背景"如果alpha = 0,你会得到一些插值结果,其中alpha是> 0,RGB与你的"背景"混合颜色。

@ tlkausi的解决方案是将背景的RGB值更改为白色。但这会导致与以前相同的问题:如果你的实际图像有深色,那么你会看到它周围的明亮文物。

正确的解决方案是重复实际边框像素的RGB颜色,这样插值总会产生相同的颜色,只有较低的alpha值。

但是,有一个更好的解决方案:预乘alpha 。 您可以存储(aR,aG,aB,a),而不是在每个像素的纹理中存储(R,G,B,a)。在混合时,您不能使用a*source + (1-a) * background,而只需使用source + (1-a)*background。不同之处在于你现在拥有一个'#34;中性元素" (0,0,0,0)并向其插值不会造成任何问题。它适用于过滤,也适用于mipmapping和其他技术。

一般情况下,我建议始终使用预乘alpha而支持"传统"一。预乘可以直接应用到图像文件中,或者您可以在纹理上传时执行,但它确实不会产生运行时成本。

可以找到有关预乘alpha的更多信息in this MSDN blog articleover here at NVIDIA