在RGBGL中使用RGB纹理作为alpha值/子像素字体渲染

时间:2018-01-28 21:09:33

标签: opengl font-rendering

目前我在子像素模式下使用FreeType并将每个像素的最大颜色作为alpha值,使用以下片段着色器:

    uniform sampler2D Image;
    uniform vec4 Color;

    smooth in vec2 vVaryingTexCoord;

    out vec4 vFragColor;

    void main(void){
        vec4 color = texture(Image, vVaryingTexCoord);
        vFragColor = color * Color;
    }

这适用于深色背景,但在较浅的背景上,边框像素显示(例如,当文本像素为(1,0,0)时)。为了使它能够使用更亮的背景,我需要传递背景颜色并自己进行混合,一旦我移动到更复杂的背景,它就会开始崩溃。

有没有办法将FreeType中的RGB值用作纯色的alpha值(传递给着色器)?这个公式基本上,其中b =背景像素,t =当前文本像素,c =静态颜色:

b*((1,1,1) - t) + t*c.rgb*c.a

我认为首先绘制其他所有内容并将该帧缓冲区传递给字体着色器会起作用,但这似乎有点矫枉过正。有没有办法在OpenGL混合阶段做到这一点?我试过玩glBlendFunc等等,但没有到达任何地方。

1 个答案:

答案 0 :(得分:0)

可以使用Dual Source Blending,自Ope​​nGL 3.3起可用。 This规范草案甚至提到了亚像素渲染作为用例。使它工作所需的一切:

glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC1_COLOR);

(别忘了启用GL_BLEND,它一直在我身上发生:D)

在片段着色器中指定双重输出:(如果需要,可以按名称绑定,请参见spec)

layout(location = 0, index = 0) out vec4 color;
layout(location = 0, index = 1) out vec4 colorMask;

主要:

color = StaticColor;
colorMask = StaticColor.a*texel;

其中StaticColor是统一的全局文本颜色,而texel是字形的当前像素值。