【发布时间】:2016-01-02 06:57:57
【问题描述】:
我正在使用 SDF 技术 http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf 在 WebGL 中呈现文本。我制作了字体的 SDF 纹理,生成 BMFont 文本度量并使用简单的片段着色器显示文本:
precision mediump float;
uniform sampler2D u_texture;
varying vec2 vUv;
float aastep(float value) {
float afwidth = 0.1;
return smoothstep(0.5 - afwidth, 0.5 + afwidth, value);
}
void main(void)
{
vec4 texColor = texture2D(u_texture, vUv);
float alpha = aastep(texColor.a);
gl_FragColor = vec4(0.0, 0.0, 0.0, alpha);
}
aastep 函数中的 afwidth 值有问题。 afwidth 简单地定义了字体边界的模糊。如果它很小,那么遥远的文字看起来很难看。如果靠近我的大文本看起来很难看。那么问题是如何在片段着色器中计算afwidth?
PS:我有一个公式可以使用 GL_OES_standard_derivatives 进行计算:
float afwidth = length(vec2(dFdx(value), dFdy(value))) * 0.70710678118654757;
但是我的硬件不支持这个扩展。所以我想我需要根据gl_FragCoord和变换矩阵来计算。
【问题讨论】:
-
链接到 Valve 论文 @ 11-2020: steamcdn-a.akamaihd.net/apps/valve/2007/…