Спустя более двух часов (да, долгий срок!), Пытаясь отладить этот код, у меня появляется текст перевода строки, который, кажется, блокирует все остальное за ним (или что-то еще).
Текст, который я пытаюсь использовать на этом методе, работает отлично, однако по какой-то причине кажется, что ничего другого не получается.
Я сделал два эксперимента с 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: Результат теста 2:
Другой соответствующий код:
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, как известно, работают, поскольку я использую их далее в коде для реализации панели работоспособности в одном из приведенных выше скриншотов без проблем.
Скажите, пожалуйста, если требуется дополнительная информация. Надеюсь, я поставил достаточно.
Следующие вызовы:
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;
}
Спасибо всем, кто помог мне отладить мою проблему! Ваша помощь неоценима.
У нас есть
if (TerrainDemo.reg){
if (true) return;
а также
static boolean reg = false;
Поскольку TerrainDemo.reg является ложным, утверждение if (true) return
не выполняется (если вы не измените значение TerrainDemo.reg, очевидно).
Поскольку ваш код работает, если метод render()
возвращает почти сразу, тогда в вызовах OpenGL указанного метода должна быть ошибка, которая предотвращает правильную визуализацию остальной части сцены, а не логическую ошибку. Используйте glGetError()
чтобы идентифицировать ошибку.
gluErrorString(glGetError())
TerrainDemo.reg
?