问题描述
我创建了 ftmesh library 来在我的 OpenGL ES 3 屏幕上绘制字体。代码有效,但字符的边缘参差不齐。我正在使用带有 OpenGL ES 3 的 NVidia Jetson AGX Xavier 并且 glShadeModel(GL_SMOOTH)
没有任何效果(glEnable(GL_polyGON_SMOOTH)
表示 Invalid Enum——因为它在 ES 中是不允许的2 或 3)。
以下是显示丑陋边缘的屏幕截图示例:
在四周添加偏移边缘并使外部部分 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 在评论中所建议的,我尝试添加多重采样。它有一个效果,它创建了一种网格形式,不过……比预期的要透明得多(见下图)。
-
在我的
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 不起作用(没有可用的缓冲区)。 -
然后我启用了示例 alpha 覆盖
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); glEnable(GL_SAMPLE_COVERAGE);
但这产生了如下所示的副作用......
-
所以我尝试了没有
glEnable()
调用,现在按预期工作]!如果你仔细观察,在最后一张图片中,我们可以看到边缘的抗锯齿:
所以 MSAA 解决了这个问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)