LWJGL - все пропало после загрузки шрифта

У меня была странная проблема, когда я пытался отобразить текст на экране. Я следовал этому руководству Slick Util — Шрифты TrueType для 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();
    }
}

person uNiverselEgacy    schedule 13.09.2013    source источник
comment
Возможно, loadDefaultFont (...) передает какое-то состояние OpenGL. Вы можете попробовать: glPushAttrib (GL_ALL_ATTRIB_BITS) перед вызовом и glPopAttrib () сразу после, чтобы увидеть, имеет ли это значение.   -  person Andon M. Coleman    schedule 13.09.2013
comment
@AndonM.Coleman Только что попробовал glPushAttrib() и glPopAttrib(). Теперь все остальное отображается, но шрифт работает неправильно. Весь текст станет прямоугольником сплошного цвета.   -  person uNiverselEgacy    schedule 13.09.2013
comment
По крайней мере, теперь мы знаем, что это вопрос государства. Не видя реализации для org.newdawn.slick.TrueTypeFont, я могу только предположить, что ваша проблема связана с состоянием GL_TEXTURE_2D.   -  person Andon M. Coleman    schedule 13.09.2013
comment
У GLScene были те же проблемы, состояние загрузки шрифта просочилось, и мне пришлось его исправить.   -  person Kromster    schedule 15.09.2013
comment
@Андон М. Коулман Это действительно как-то связано с GL_TEXTURE_2D. Мне нужно отключить GL_TEXTURE_2D, прежде чем рисовать что-либо еще, и снова включить GL_TEXTURE_2D для рендеринга текста.   -  person uNiverselEgacy    schedule 29.09.2013
comment
Разве TTF не должен быть векторным шрифтом, а не растровым шрифтом? Почему это должно иметь какое-то отношение к текстуре?   -  person uNiverselEgacy    schedule 29.09.2013
comment
Отдельные шрифты обведены таким образом, но обычно они визуализируются с использованием определенного набора характеристик (например, полужирный + курсив) и помещаются в лист спрайтов для простейшего рендеринга шрифтов в OpenGL. Более сложные системы фактически отображают текст с использованием FreeType, но в итоге все равно получается растянутая текстура.   -  person Andon M. Coleman    schedule 29.09.2013


Ответы (1)


Если у вас есть Slick-Util в качестве библиотеки, попробуйте добавить TextureImpl.bindNone(); после каждого вызова для рендеринга текста.

person John Smith    schedule 16.07.2015