我正在基于OpenGL的UI系统快速文本渲染,这将使用子像素渲染,黑色背景上的白色文本适用于“正常”混合,但白色黑色文本背景没有,因为子像素着色的颜色边缘被乘以0(因为是黑色的),并且子像素混叠被丢失。我知道这不是“正确的”方式(因为我需要分别混合每个R,G和B子像素通道),但其速度非常快,几乎在任何情况下都看起来很不错。OpenGL混合(混合之前反转纹理颜色)
为了做到这一点,我需要反转勾兑“之前的”纹理颜色完成,例如:
正常的混合是:SourceColor * SourceAlpha + DestColor * (1 - SourceAlpha)
我想这一点:((1,1,1) - SourceColor) * SourceAlpha + DestColor * (1 - SourceAlpha)
有没有一种方法来做到这一点没有着色器?我认为关键是做两个不同的混合设置,但我不能得到它的工作
我知道我可以有两个纹理,一个正常和一个倒,但我不想浪费视频存储器(因为每个字体requieres已经大纹理)
“*子像素着色的颜色边缘乘以0(因为是黑色),子像素混叠会丢失。*”这没有意义。除非预先将颜色与alpha相乘,否则这是不可能的。如果边缘alpha是0,那么alpha必须远离零。所以它应该采用背景颜色(即:它与之混合的白色)。如果你做了预乘以阿尔法颜色(即:您使用的是强度纹理),你不应该与源阿尔法·源颜色的混合级再乘以*。 –
字体是预渲染,使用像素着色(位图字体),问题是当我想所有设置渲染文本的颜色,如果我想它白色的,我乘(1,1 RGBA位图, 1)如果我想它红色,我乘以(1,0,0)全部,如果我想黑色,我乘以全部(0,0,0),但是当我这样做时,唯一的信息保留在位图仅是Alpha通道。没有图片很难解释,但主要想法很好 – rafael
在这种情况下,“子像素渲染”是什么意思?你在谈论[这种东西](http://en.wikipedia.org/wiki/Subpixel_rendering#Addressability_vs._resolution)? –