gpt4 book ai didi

java - UnicodeFont 渲染似乎阻止了其他所有内容的渲染?

转载 作者:行者123 更新时间:2023-11-30 03:50:09 25 4
gpt4 key购买 nike

在尝试调试这段代码两个多小时(是的,很长一段时间!)之后,我似乎有一条线渲染文本,它似乎掩盖了它后面的所有其他内容(或其他东西)。

我尝试在该方法上绘制的文本工作正常,但无论出于何种原因,似乎没有其他渲染。

我用 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 的结果: enter image description here测试2的结果: enter image description here

其他相关代码:

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;
}

感谢所有帮助我解决问题的人!您的帮助非常宝贵。

关于java - UnicodeFont 渲染似乎阻止了其他所有内容的渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com