UnicodeFont渲染似乎遮挡了其他一切渲染?

问题描述 投票:1回答:2

经过两个多小时(是的,很长的时间!)的调试,我似乎有一行渲染文字,似乎要把后面的所有东西都涂掉(或其他)。

我试图在该方法上绘制的文本可以正常工作,然而不管出于什么原因,似乎没有其他的东西在渲染。

我做了两个实验 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);
}

Ready 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是可以工作的,因为我在上面的一个截图中使用它们来实现健康条,没有任何问题。

如果需要更多的信息,请告诉我。我希望我已经放的够多了。

java opengl lwjgl 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;
        }

感谢所有帮助我调试问题的人!你们的帮助是无价的。


1
投票

我们已经

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

static boolean reg = false;

由于TerrainDemo.reg为false,所以语句中的 if (true) return 不被执行(除非你改变TerrainDemo.reg的值,很明显)。

由于你的代码在方法 render() 几乎立即返回,那么一定是上述方法的 OpenGL 调用中出现了错误,导致场景的其他部分无法正确渲染,而不是逻辑错误。使用 glGetError() 来识别错误。

© www.soinside.com 2019 - 2024. All rights reserved.