【问题标题】:LWJGL - everything is gone after loading fontLWJGL - 加载字体后一切都消失了
【发布时间】:2013-09-17 15:57:02
【问题描述】:

当我尝试在屏幕上显示一些文本时遇到了一个奇怪的问题。我遵循了本教程Slick Util - TrueType Fonts for LWJGL。文本显示正确,但其他一切都消失了。即使没有呈现文本,也会发生这种情况。当我删除加载字体的代码时它会恢复正常。

这是我的代码:(当我有这行代码时,矩形不会显示:this.font = this.loadDefaultFont(30);)

import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_MODELVIEW;
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.GL_PROJECTION;
import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.glBegin;
import static org.lwjgl.opengl.GL11.glBlendFunc;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.opengl.GL11.glColor4f;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glEnd;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glMatrixMode;
import static org.lwjgl.opengl.GL11.glOrtho;
import static org.lwjgl.opengl.GL11.glVertex2i;

import java.awt.Font;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.newdawn.slick.Color;
import org.newdawn.slick.TrueTypeFont;

public class TrueTypeFontDemo {
    private TrueTypeFont font;

    public TrueTypeFontDemo() {
        try {
            Display.setDisplayMode(new DisplayMode(800, 600));
            Display.setTitle("TrueTypeFont Demo");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 800, 600, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        this.font = this.loadDefaultFont(30);

        while (!Display.isCloseRequested()) {
            glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);

            this.font.drawString(100, 100, "Hello world", Color.red);

            glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
            glBegin(GL_QUADS);
            {
                glVertex2i(500, 500);
                glVertex2i(500, 50);
                glVertex2i(600, 50);
                glVertex2i(600, 500);
            }
            glEnd();

            Display.update();
            Display.sync(60);
        }

        Display.destroy();
    }

    private TrueTypeFont loadDefaultFont(int size) {
        // load a default java font
        Font awtFont = new Font("Times New Roman", Font.PLAIN, size);
        return new TrueTypeFont(awtFont, false);
    }

    public static void main(String[] args) {
        new TrueTypeFontDemo();
    }
}

【问题讨论】:

  • loadDefaultFont (...) 可能会泄漏一些 OpenGL 状态。您可以尝试:glPushAttrib (GL_ALL_ATTRIB_BITS) 在调用它之前,然后立即glPopAttrib (),看看这是否会有所不同。
  • @AndonM.Coleman 刚刚尝试了 glPushAttrib() 和 glPopAttrib()。现在其他所有内容都出现了,但字体无法正常工作。所有的文字都会变成一个纯色的矩形。
  • 至少我们现在知道这是一个州问题。没有看到 org.newdawn.slick.TrueTypeFont 的实现,我只能猜测您的问题与 GL_TEXTURE_2D 状态有关。
  • GLScene 有同样的问题,字体加载泄露状态,我不得不修补它。
  • @Andon M. Coleman 这确实与GL_TEXTURE_2D 有关。我需要在绘制其他任何内容之前禁用GL_TEXTURE_2D 并再次启用GL_TEXTURE_2D 以呈现文本。

标签: java opengl lwjgl truetype


【解决方案1】:

如果您将 Slick-Util 作为库,请尝试在每次调用后添加 TextureImpl.bindNone(); 以呈现文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多