Рендеринг UnicodeFont, кажется, блокирует все остальное от рендеринга?

1

Спустя более двух часов (да, долгий срок!), Пытаясь отладить этот код, у меня появляется текст перевода строки, который, кажется, блокирует все остальное за ним (или что-то еще).

Текст, который я пытаюсь использовать на этом методе, работает отлично, однако по какой-то причине кажется, что ничего другого не получается.

Я сделал два эксперимента с if (true) return; линий.

Первый эксперимент выглядел так:

 public static void render() {
    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(orthographicProjectionMatrix);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glDisable(GL_LIGHTING);

    width = Display.getWidth()/2;
    height = Display.getHeight()/2;
    int ch = Display.getHeight()/10;
   // int locationY = 100;
    //if (true) return;
    //if (true) return;



        String msg = loadMessage;

        if (msg.contains("RED")){
            msg = msg.replace("RED", "");
            int offset = font.getWidth(msg)/2;
            font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.red);
            if (true) return;
        }else if (msg.contains("YELLOW")){
            msg = msg.replace("YELLOW", "");
            int offset = font.getWidth(msg)/2;
            font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.yellow);
            if (true) return;
        }else{
            int offset = font.getWidth(msg)/2;
         font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.magenta);
         if (true) return;
        }


    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glEnable(GL_LIGHTING);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(perspectiveProjectionMatrix);
    glMatrixMode(GL_MODELVIEW);

}

И второе было так:

    public static void render() {
    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(orthographicProjectionMatrix);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glDisable(GL_LIGHTING);

    width = Display.getWidth()/2;
    height = Display.getHeight()/2;
    int ch = Display.getHeight()/10;
   // int locationY = 100;
    //if (true) return;
    //if (true) return;



        String msg = loadMessage;

        if (msg.contains("RED")){
            msg = msg.replace("RED", "");
            int offset = font.getWidth(msg)/2;
            if (true) return;
            font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.red);
        }else if (msg.contains("YELLOW")){
            msg = msg.replace("YELLOW", "");
            int offset = font.getWidth(msg)/2;
            if (true) return;
            font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.yellow);

        }else{
            int offset = font.getWidth(msg)/2;
          if (true) return;
         font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.magenta);

        }


    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glEnable(GL_LIGHTING);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(perspectiveProjectionMatrix);
    glMatrixMode(GL_MODELVIEW);

}

С первым, ничего не отображается (Edit: Text теперь отображает, однако все еще только синий за ним).

Во втором, все, кроме текста, который этот метод оказывает рендеринг, отлично работает.

Итак, в чем разница? Я просто не понимаю. И я просто не могу это исправить.

Результат теста 1: Изображение 174551 Результат теста 2: Изображение 174551

Другой соответствующий код:

static void setUpFonts() {
    java.awt.Font awtFont = new java.awt.Font("Times New Roman", java.awt.Font.BOLD, 18);
    font = new UnicodeFont(awtFont);
    font.getEffects().add(new ColorEffect(java.awt.Color.white));
    font.addAsciiGlyphs();
    try {
        font.loadGlyphs();
    } catch (SlickException e) {
        e.printStackTrace();
        cleanUp();
    }
}

Вызов метода:

ready2D();
    TextDemo.setUpCamera();
    TextDemo.render();
    camSetup();
    ready3D();

Вызов варианта метода (предлагается в комментариях), который не имел никакого значения:

    ready2D();
    glPushMatrix();
    TextDemo.setUpCamera();
    TextDemo.render();
    glPopMatrix();
    ready3D();

Чтение 2D:

static void ready2D()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    GLU.gluOrtho2D(0.0f, 1, 1, 0.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.375f, 0.375f, 0.0f);

    glDisable(GL_DEPTH_TEST);
}

Готово 3D:

static void ready3D()
{
    glViewport(0, 0, Display.getWidth(),Display.getHeight());
    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();
    GLU.gluPerspective(45, (float) Display.getWidth()/Display.getHeight(), 0.1f, 5000.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
}

Ready2D и Ready3D, как известно, работают, поскольку я использую их далее в коде для реализации панели работоспособности в одном из приведенных выше скриншотов без проблем.

Скажите, пожалуйста, если требуется дополнительная информация. Надеюсь, я поставил достаточно.

  • 0
    Что такое TerrainDemo.reg ?
  • 0
    @immibis - Отредактировано.
Показать ещё 11 комментариев
Теги:
opengl
lwjgl
slick
slick2d

2 ответа

1
Лучший ответ

Следующие вызовы:

glLoadIdentity();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(orthographicProjectionMatrix);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glDisable(GL_LIGHTING);

Появилась возможность влиять на мои чертежные матрицы для 3D.

Чтобы исправить это, я использовал то, что раньше никогда не использовал, glPushAttrib() и glPopAttrib().

Следующий код исправил проблему:

glPushAttrib(GL_ENABLE_BIT);
    glLoadIdentity();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(orthographicProjectionMatrix);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glDisable(GL_LIGHTING);

    width = Display.getWidth()/2;
    height = Display.getHeight()/2;
    int ch = Display.getHeight()/10;
   // int locationY = 100;
    //if (true) return;
    //if (true) return;

    glDisable(GL_TEXTURE_2D);

        String msg = loadMessage;

        if (false){ //If statements are here, but are irrelevant to fixing the issue
        }else{
            int offset = font.getWidth(msg)/2;
         font.drawString(Display.getWidth()/2 - offset, Display.getHeight()/2, msg, Color.magenta);
         glPopMatrix();
         glPopAttrib();
         System.out.println("Error: " + glGetError());
         glGetError();
         if (true) return;
        }

Спасибо всем, кто помог мне отладить мою проблему! Ваша помощь неоценима.

  • 0
    О, отлично, я могу принять свой ответ только через 10 часов после публикации. Отличное сообщество, но сама система довольно ужасна в подобных случаях.
1

У нас есть

if (TerrainDemo.reg){
  if (true) return;

а также

static boolean reg = false;

Поскольку TerrainDemo.reg является ложным, утверждение if (true) return не выполняется (если вы не измените значение TerrainDemo.reg, очевидно).

Поскольку ваш код работает, если метод render() возвращает почти сразу, тогда в вызовах OpenGL указанного метода должна быть ошибка, которая предотвращает правильную визуализацию остальной части сцены, а не логическую ошибку. Используйте glGetError() чтобы идентифицировать ошибку.

  • 0
    вернуть; выдает ошибку в моей IDE. if (true) возврат; не. Я посмотрю на вашу вещь GLGetError.
  • 0
    Ваша IDE странная. О glGetError, включите GLUT и используйте gluErrorString (): gluErrorString(glGetError())
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню