2012-11-16 97 views
1

我正在基于OpenGL的UI系统快速文本渲染,这将使用子像素渲染,黑色背景上的白色文本适用于“正常”混合,但白色黑色文本背景没有,因为子像素着色的颜色边缘被乘以0(因为是黑色的),并且子像素混叠被丢失。我知道这不是“正确的”方式(因为我需要分别混合每个R,G和B子像素通道),但其速度非常快,几乎在任何情况下都看起来很不错。OpenGL混合(混合之前反转纹理颜色)

为了做到这一点,我需要反转勾兑“之前的”纹理颜色完成,例如:

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

我想这一点:((1,1,1) - SourceColor) * SourceAlpha + DestColor * (1 - SourceAlpha)

有没有一种方法来做到这一点没有着色器?我认为关键是做两个不同的混合设置,但我不能得到它的工作

我知道我可以有两个纹理,一个正常和一个倒,但我不想浪费视频存储器(因为每个字体requieres已经大纹理)

+0

“*子像素着色的颜色边缘乘以0(因为是黑色),子像素混叠会丢失。*”这没有意义。除非预先将颜色与alpha相乘,否则这是不可能的。如果边缘alpha是0,那么alpha必须远离零。所以它应该采用背景颜色(即:它与之混合的白色)。如果你做了预乘以阿尔法颜色(即:您使用的是强度纹理),你不应该与源阿尔法·源颜色的混合级再乘以*。 –

+0

字体是预渲染,使用像素着色(位图字体),问题是当我想所有设置渲染文本的颜色,如果我想它白色的,我乘(1,1 RGBA位图, 1)如果我想它红色,我乘以(1,0,0)全部,如果我想黑色,我乘以全部(0,0,0),但是当我这样做时,唯一的信息保留在位图仅是Alpha通道。没有图片很难解释,但主要想法很好 – rafael

+0

在这种情况下,“子像素渲染”是什么意思?你在谈论[这种东西](http://en.wikipedia.org/wiki/Subpixel_rendering#Addressability_vs._resolution)? –

回答

0

给您的字体纹理的α通道,然后用它来指定字体的形状,同时保持在纹理的每个像素的颜色为白色,外连的那些像素(它得到alpha = 0,所以它们是rgba = 1110)。然后glColor3f(r,g,b)会正确地为您的纹理着色(甚至是黑色),如果您使用glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);,它将被正确混合。