OpenGL混合(在混合之前反转纹理颜色)



我正在为基于OpenGL的UI系统进行快速文本渲染,该系统使用亚像素渲染,黑色背景上的白色文本可以很好地进行"正常"混合,但白色背景上的黑色文本则不行,因为亚像素渲染的彩色条纹会乘以0(因为是黑色),并且亚像素混叠会丢失。

我知道这不是"正确"的方式(因为我需要分别混合每个R、G和B亚像素通道),但它非常快,几乎在任何情况下都很好看。

为了做到这一点,我需要在混合完成之前反转纹理颜色,例如:

正常混合为:SourceColor * SourceAlpha + DestColor * (1 - SourceAlpha)

我想要这个:((1,1,1) - SourceColor) * SourceAlpha + DestColor * (1 - SourceAlpha)

有没有一种方法可以在没有着色器的情况下做到这一点??我认为关键是用不同的混合设置做两次传球,但我就是不能让它在上工作

我知道我可以有两种纹理,一种是普通的,另一种是反转的,但我不想浪费视频内存(因为每个字体都需要一个已经很大的纹理)

给你的字体纹理一个alpha通道,然后用它来指定字体的形状,同时保持纹理中每个像素的颜色为白色,甚至是外部的像素(它们的alpha=0,所以它们是rgba=1110)。然后glColor3f(r,g,b)会适当地给你的纹理上色(甚至是黑色),如果你使用glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);,它会被适当地混合。

最新更新