【发布时间】:2018-07-07 13:30:42
【问题描述】:
目前我在亚像素模式下使用 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 之类的,但没有成功。
【问题讨论】:
-
根据我的经验,这是一个难以破解的难题。你的结论和我的一样。我最终放弃了。您可能想尝试通过文本周围的光环“强制”背景颜色并与该颜色混合。至于 OpenGL 混合阶段,我的直觉说“做不到”。
-
FreeType shader(看看结尾)显示使用纹理中的
max和min并将它们用作alpha。然后,计算着色器中的混合。
标签: opengl font-rendering