You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL 4.6结合Freetype渲染文本无显示问题排查求助

问题排查与修复方案

以下是你代码中存在的致命错误及对应修复方案:

  • 1. Character结构体成员赋值完全颠倒
    你错误地将字形尺寸和偏移量的赋值搞反,会导致字符位置、宽高计算完全错误,字符超出可视范围:
// 错误代码
ch.bearing[0] = face->glyph->bitmap.width;
ch.bearing[1] = face->glyph->bitmap.rows;
ch.size[0] = face->glyph->bitmap_left;
ch.size[1] = face->glyph->bitmap_top;

修复为:

// 正确赋值
ch.size[0] = face->glyph->bitmap.width;    // 字形纹理宽度
ch.size[1] = face->glyph->bitmap.rows;     // 字形纹理高度
ch.bearing[0] = face->glyph->bitmap_left;  // 字形距离基线的左侧偏移
ch.bearing[1] = face->glyph->bitmap_top;   // 字形距离基线的上侧偏移
  • 2. drawText调用参数不匹配
    你定义的drawText为4个参数:float x, float y, float scale, char *text,但绘制循环中调用时只传了3个参数,缺少scale参数会导致参数栈混乱,scale为随机垃圾值,字符要么无限小要么超出屏幕。
    修复调用代码:
drawText(10, 300, 1.0f, "Hello World!"); // 补充scale参数,1.0f为原始大小
  • 3. 顶点着色器投影矩阵未赋值
    顶点着色器中location=1的projection正交投影矩阵没有做任何赋值操作,默认值为0矩阵,所有顶点经过投影后都会落在屏幕外。需要在初始化或绘制前给投影矩阵赋值,适配你的窗口坐标:
// 示例:窗口宽度width、高度height,正交投影左上角为(0,0),右下角为(width,height)
float projection[4][4] = {
    {2.0f/width, 0, 0, 0},
    {0, -2.0f/height, 0, 0},
    {0, 0, -1.0f, 0},
    {-1.0f, 1.0f, 0, 1.0f}
};
glUseProgram(textShader);
glUniformMatrix4fv(1, 1, GL_FALSE, &projection[0][0]);
  • 4. 未开启混合功能,透明区域显示异常
    你使用单通道R8格式存储字形纹理,文字以外区域R值为0,未开启混合的情况下透明区域会渲染为黑色块,甚至盖住文字。需在绘制文字前开启混合:
// 放在drawText函数glUseProgram之后
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// 绘制结束后关闭混合避免影响其他渲染逻辑
glDisable(GL_BLEND);
  • 5. 面剔除可能导致字符被直接剔除
    你在drawText开头开启了GL_CULL_FACE,如果字符顶点缠绕顺序和OpenGL默认逆时针规则不符,字符的三角面会被直接剔除,可临时注释掉glEnable(GL_CULL_FACE)测试,确认问题后调整顶点顺序或关闭文字渲染阶段的面剔除。

修复以上问题后文字即可正常渲染,若仍存在异常可调用glGetShaderiv、glGetProgramiv校验着色器编译、链接状态,排查着色器代码错误。

内容的提问来源于stack exchange,提问作者Automaton3d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:15:01