【问题标题】:Opengl + FreeType aliasingOpengl + FreeType 别名
【发布时间】:2014-05-08 11:32:31
【问题描述】:

我正在尝试使用带有 FreeType 库的 OpenGL 显示一些文本。它工作正常,但文本看起来不那么流畅。在 FreeType 文档中,它说在加载过程中纹理有一些抗锯齿,但在我的情况下看起来不是这样。 这就是我正在做的:

FT_Init_FreeType(&m_fontLibrary);
FT_New_Face(m_fontLibrary, "src/VezusLight.OTF", 0, &m_BFont);
FT_Set_Pixel_Sizes(m_BFont, 0, 80);
m_glyph = m_BFont->glyph;
GLuint tex;
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glUseProgram(m_textPipeline);
glUniform1i(m_texLocation, 1);
glUseProgram(0);

然后渲染:

glActiveTexture(GL_TEXTURE1);
glEnableVertexAttribArray(m_coordTex);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
const char *p;
float x = x_i, y = y_i;
const char* result = text.c_str();
for (p = result; *p; p++)
{
    if (FT_Load_Char(m_BFont, *p, FT_LOAD_RENDER))
        continue;

    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_ALPHA,
        m_glyph->bitmap.width,
        m_glyph->bitmap.rows,
        0,
        GL_ALPHA,
        GL_UNSIGNED_BYTE,
        m_glyph->bitmap.buffer
        );

    float x2 = x - 1024 + m_glyph->bitmap_left;
    float y2 = y - 600 - m_glyph->bitmap_top;
    float w = m_glyph->bitmap.width;
    float h = m_glyph->bitmap.rows;

    GLfloat box[4][4] = {
        { x2, -y2 - h, 0, 1 },
        { x2 + w, -y2 - h, 1, 1 },
        { x2, -y2, 0, 0 },
        { x2 + w, -y2, 1, 0 },
    };



    glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(GLfloat), box, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(m_coordTex, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), NULL);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    x += (m_glyph->advance.x >> 6);
    y += (m_glyph->advance.y >> 6);
}
glDisableVertexAttribArray(m_coordTex);

结果如下所示:

谁能发现我的代码中的问题?

【问题讨论】:

  • 不使用 alpha 透明度时,你得到完全相同的结果吗?
  • 为什么投反对票?

标签: opengl freetype


【解决方案1】:

您的代码有两个问题。

第一个是缓冲区溢出:box 结构中的纹理坐标是 vec2,但是您告诉 glVertexAttribPointer 它是 vec4(重要的是 4*sizeof(float) 的步幅,大小不匹配参数使 OpenGL 在 box 数组的末尾读取超出边界 2 个元素)。

您的纹理看起来像素化是因为纹理坐标 0 和 1 并不位于像素中心,而是位于纹理的边缘。在片段着色器中使用texelFetch 通过像素坐标来处理像素,或者将纹理范围重新映射到[0…1] 范围内,如https://stackoverflow.com/a/5879551/524368 中所述

【讨论】:

    【解决方案2】:

    我认为具有透明颜色或平滑或抗锯齿字形, 您必须在 opengl 中启用混合并禁用深度测试。 (您可以通过在互联网上搜索找出原因和方法)。

    类似这样的:

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    //and if it didn't work, then disable depth testing by uncommenting this:
    //glDisable(GL_DEPTH_TEST); 
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多