尝试调试此代码超过两个小时(是的,这是一个很长的时间!),我似乎有一个行渲染文本,似乎是在弄清楚它背后的所有其他内容(或其他东西)。 / p>
我试图在该方法上绘制的文本工作正常,但无论出于何种原因,似乎没有其他任何渲染。
我用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);
}
使用第一个,没有任何渲染(编辑:文本现在呈现,但在它后面仍然只是蓝色)。
使用第二个,除了这个特定方法渲染的文本之外的所有内容都能正常工作。
那么,有什么区别?我无法理解它。我无法修复它。
测试结果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已知可行,因为我在代码中进一步使用它们来实现上述屏幕截图中的健康栏,没有任何问题。
如果需要更多信息,请告诉我。我希望我已经足够了。
答案 0 :(得分:1)
我们有
if (TerrainDemo.reg){
if (true) return;
和
static boolean reg = false;
由于TerrainDemo.reg为false,因此不执行语句if (true) return
(除非您更改TerrainDemo.reg的值,显然)。
由于您的代码在方法render()
几乎立即返回时起作用,因此在所述方法的OpenGL调用中必定存在错误,该错误会阻止场景的其余部分正确呈现,而不是逻辑错误。使用glGetError()
标识错误。
答案 1 :(得分: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;
}
谢谢所有帮我调试问题的人!你的帮助非常宝贵。