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
相关产品推荐
相关产品推荐

