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
@Andon M. Coleman Наистина има нещо общо с 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