如何使用 OpenGL 渲染平滑字体实际上是任何“平面”形状?

问题描述

我创建了 ftmesh library 来在我的 OpenGL ES 3 屏幕上绘制字体。代码有效,但字符的边缘参差不齐。我正在使用带有 OpenGL ES 3 的 NVidia Jetson AGX Xavier 并且 glShadeModel(GL_SMOOTH) 没有任何效果glEnable(GL_polyGON_SMOOTH) 表示 Invalid Enum——因为它在 ES 中是不允许的2 或 3)。

以下是显示丑陋边缘的屏幕截图示例:

enter image description here

在四周添加偏移边缘并使外部部分 100% 透明是唯一的选择吗?

或者有没有办法用着色器来做到这一点?获得示例链接会很棒。

我当前的着色器只是按原样传输顶点:

varying vec4 polygon_color;

attribute vec2 in_position;
attribute vec4 in_color;

void main()
{
    polygon_color = in_color;
    gl_Position = vec4(in_position.xy,1);
}

这里是片段着色器:

varying vec4 polygon_color;

void main()
{
    gl_FragColor = polygon_color;
}

我在调用 in_color 之前将所有 (1.0f,1.0f,0.75f) 顶点设置为 glDrawArrays()

样品缓冲液(溶液)

正如 Rabbid76 在评论中所建议的,我尝试添加多重采样。它有一个效果,它创建了一种网格形式,不过……比预期的要透明得多(见下图)。

  1. 在我的 g_egl_visual_attributes 中,我像这样添加EGL_SAMPLE_BUFFERS

     constexpr EGLint const g_egl_visual_attributes[] =
     {
         EGL_RED_SIZE,8,EGL_GREEN_SIZE,EGL_BLUE_SIZE,EGL_ALPHA_SIZE,EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_SAMPLE_BUFFERS,1,// <-- added this option
         EGL_SAMPLES,//     and this one
         EGL_NONE,};
    

    注意:根据我的配置,EGL_SAMPLES of 16 不起作用(没有可用的缓冲区)。

  2. 然后我启用了示例 alpha 覆盖

     glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
     glEnable(GL_SAMPLE_COVERAGE);
    

    但这产生了如下所示的副作用......

    enter image description here

  3. 所以我尝试了没有 glEnable() 调用,现在按预期工作]!

    如果你仔细观察,在最后一张图片中,我们可以看到边缘的抗锯齿:

    enter image description here

    所以 MSAA 解决了这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)