旧版LWJGL使用Slick Util绘制文本无显示问题求助
旧版LWJGL文本无法显示的排查与修复
以下是针对你遇到的TrueTypeFont文本不显示问题的具体排查方向和修复方案:
1. 配置正交投影矩阵
旧版LWJGL默认使用透视投影矩阵,2D文本很可能落在视锥体范围外导致不可见。绘制文本前必须切换到正交投影:
// 保存当前矩阵状态,避免影响其他渲染逻辑 GL11.glPushMatrix(); // 切换到投影矩阵并设置正交范围 GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); // 参数对应:左边界、右边界、下边界、上边界、近裁剪面、远裁剪面 // 这里假设canvas是你的渲染窗口,坐标原点设为左上角 GL11.glOrtho(0, canvas.getWidth(), canvas.getHeight(), 0, -1, 1); // 切换回模型视图矩阵 GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); // 绘制文本逻辑 GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); font.drawString(x, y, text); GL11.glDisable(GL11.GL_BLEND); // 恢复之前的矩阵状态 GL11.glPopMatrix();
2. 显式设置文本颜色
TrueTypeFont默认文本颜色为黑色,如果你的渲染背景也是黑色,文本会完全被遮挡。绘制时指定亮色:
// 使用带颜色参数的drawString重载 font.drawString(x, y, text, new Color(255, 255, 255)); // 白色文本 // 或者全局设置字体颜色 font.setColor(Color.WHITE); font.drawString(x, y, text);
3. 确保字体加载成功
部分系统可能没有"Arial"字体,导致TrueTypeFont初始化失败但无报错。换用系统通用字体:
// 使用系统内置的无衬线字体,兼容性更强 Font awtFont = new Font(Font.SANS_SERIF, Font.BOLD, 24); font = new TrueTypeFont(awtFont, false);
4. 修正坐标系统匹配
旧版LWJGL的正交投影默认原点在左下角,如果你传入的x,y是窗口左上角坐标,文本会被绘制到屏幕外。转换坐标:
// 将左上角坐标转换为左下角坐标 int adjustedY = canvas.getHeight() - y - font.getHeight(text); font.drawString(x, adjustedY, text);
5. 排除其他OpenGL状态干扰
- 禁用深度测试:如果当前启用了
GL_DEPTH_TEST,2D文本可能被深度缓冲中的其他元素遮挡,绘制前禁用:GL11.glDisable(GL11.GL_DEPTH_TEST); // 绘制文本 GL11.glEnable(GL11.GL_DEPTH_TEST); // 后续需要3D渲染时再开启 - 检查纹理绑定:确保绘制文本前没有绑定其他纹理,TrueTypeFont需要使用自身生成的纹理,可在绘制前调用
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0)重置纹理绑定。
内容的提问来源于stack exchange,提问作者CoderGodToRun
相关产品推荐
相关产品推荐

