【发布时间】:2012-11-16 22:11:29
【问题描述】:
我正在为基于 OpenGL 的 UI 系统进行快速文本渲染,该系统使用亚像素渲染,黑色背景上的白色文本适用于“正常”混合,但白色背景上的黑色文本不能,因为颜色边缘亚像素渲染乘以0(因为是黑色),亚像素锯齿丢失。
我知道这不是“正确”的方式(因为我需要分别混合每个 R、G 和 B 子像素通道)但它非常快并且几乎在所有情况下看起来都不错。
为了做到这一点,我需要在混合完成“之前”反转纹理颜色,例如:
正常混合是:SourceColor * SourceAlpha + DestColor * (1 - SourceAlpha)
我想要这个:((1,1,1) - SourceColor) * SourceAlpha + DestColor * (1 - SourceAlpha)
有没有办法在没有着色器的情况下做到这一点?我认为关键是用不同的混合设置进行两次通过,但我就是无法让它工作
我知道我可以有两种纹理,一种是正常的,一种是倒置的,但我不想浪费视频内存(因为每种字体都需要一个已经很大的纹理)
【问题讨论】:
-
"子像素渲染的彩色条纹被乘以0(因为是黑色的),丢失了子像素锯齿。" 这没有任何意义。除非您将颜色与 alpha 预先相乘,否则这是不可能的。如果边缘 alpha 为 0,则 alpha 必须远离零。所以它应该采用背景颜色(即:它正在混合的白色)。如果您确实将颜色与 alpha 进行了预乘(即:您使用的是强度纹理),则不应在混合阶段将源颜色与源 alpha再次相乘。
-
字体是使用子像素渲染(位图字体)在 RGBA 位图上预渲染的,当我想设置渲染文本的颜色时出现问题,如果我想要它为白色,我乘以全部乘以 (1,1,1) 如果我想要红色,我将全部乘以 (1,0,0),如果我想要黑色,我将全部乘以 (0,0,0),但是当我这样做时,位图上剩下的唯一信息就是 Alpha 通道。没有图片很难解释,但主要思想很好
-
在这种情况下,“亚像素渲染”是什么意思?你在说this kind of stuff吗?
-
yes :) 喜欢清晰的类型,但使用 open gl 并且比 GDI+ 快得多,我编写了一个软件文本渲染器,然后我将软件位图复制到 opengl 纹理上。它适用于我正在开发的基于 openGL 的 UI 框架
标签: opengl rendering alpha blending