如何修复边缘符号距离场输出?

问题描述 投票:0回答:2

我尝试使用 OpenGL ES 2.0 和有符号距离场渲染一些文本/字体。我为字体创建了一个 SDF 位图,并且可以将一些文本渲染到屏幕上,但显示的文本边缘非常明显。

在这里您可以看到我的有符号距离场输入的一部分:Input

在这里您可以在屏幕上看到我的输出:output

生成纹理并用位图填充:

    GL.Enable(EnableCap.Texture2D);
    GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
    GL.GenTextures(1, out TextureId); 
    GL.BindTexture(TextureTarget.Texture2D, TextureId); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.NearestMipmapLinear);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) TextureMagFilter.Linear);
    GL.GenerateMipmap(TextureTarget.Texture2D);
    GL.TexImage2D(TextureTarget2d.Texture2D,0,TextureComponentCount.Rgba,Width,Height,0,PixelFormat.Rgba,PixelType.UnsignedByte,ImageData);
    GL.GenerateMipmap(TextureTarget.Texture2D);

片段着色器:

void main() 
{   
    float distance = texture2D(tex_object, tc).a;
    float alpha = smoothstep(0.5 - 0.05, 0.5 + 0.05, distance); 
    fragColor = vec4(fColor.rgb, fColor.a * alpha);
}

着色器已正确编译,并且值已正确传递,因为显示了字母。 有人知道如何解决这个问题并使其更顺畅吗?

fonts opengl-es
2个回答
1
投票

您正在使用 NearestMipmapLinear,而您应该使用 LinearMipmapNearest。

NearestMipmapLinear 在 mipmap 级别之间平滑插值,并在 mip 内进行点过滤。

LinearMipmapNearest 是 mipmap 级别之间的点过滤和 mip 内的双线性过滤。


0
投票
float alpha = smoothstep(0.5 - 0.05, 0.5 + 0.05, distance); 

尝试为 smoothstep 的边缘使用不同的值,即更改 - 0.05 和 + 0.05。

© www.soinside.com 2019 - 2024. All rights reserved.