【问题标题】:OpenGL Blending (Invert texture color before blending)OpenGL混合(混合前反转纹理颜色)
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多