2011-09-03 69 views
0

我想使用slick-util的教程在我的openGL應用程序頂部渲染一個文本字符串:http:// lwjgl.org/wiki/index.php?title=Slick-Util_Library_ -_Part_3 _-_ TrueType_Fonts_for_LWJGLLWJGL使用slick-util渲染文本

這是我的初始化代碼:

private void init() { 

    try { 
     Display.setDisplayMode(new DisplayMode(640, 480)); 
     Display.setVSyncEnabled(true); 
     Display.setTitle(this.windowTitle); 
     Display.create(); 

     Keyboard.create(); 

    } catch (LWJGLException e) { 
     Sys.alert("Error", "Initialization failed!\n\n" + e.getMessage()); 
     System.exit(0); 
    } 

    /* OpenGL */ 
    int width = Display.getDisplayMode().getWidth(); 
    int height = Display.getDisplayMode().getHeight(); 

    GL11.glViewport(0, 0, width, height); // Reset The Current Viewport 
    GL11.glMatrixMode(GL11.GL_PROJECTION); // Select The Projection Matrix 
    GL11.glLoadIdentity(); // Reset The Projection Matrix 
    GLU.gluPerspective(45.0f, ((float) width/(float) height), 0.1f, 100.0f); // Calculate The Aspect Ratio Of The Window 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The Modelview Matrix 
    GL11.glLoadIdentity(); // Reset The Modelview Matrix 

    GL11.glEnable(GL11.GL_TEXTURE_2D); 
    //GL11.glShadeModel(GL11.GL_SMOOTH); // Enables Smooth Shading 
    GL11.glShadeModel(GL11.GL_FLAT); 
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background 
    GL11.glClearDepth(1.0f); // Depth Buffer Setup 
    GL11.glEnable(GL11.GL_DEPTH_TEST); // Enables Depth Testing 
    GL11.glDepthFunc(GL11.GL_LEQUAL); // The Type Of Depth Test To Do 
    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); // Really Nice Perspective Calculations 
    //GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); // Set The Blending Function For Translucency 
    //GL11.glEnable(GL11.GL_BLEND); 


    /* Set up the light */ 
    // Ambient Light 
    lightAmbient.put(0, 1.0f); 
    lightAmbient.put(1, 1.0f); 
    lightAmbient.put(2, 1.0f); 
    lightAmbient.put(3, 1.0f); 

    // Diffuse Light 
    lightDiffuse.put(0, 1.0f); 
    lightDiffuse.put(1, 1.0f); 
    lightDiffuse.put(2, 1.0f); 
    lightDiffuse.put(3, 1.0f); 

    // Light Position 
    lightPosition.put(0, 25.0f); 
    lightPosition.put(1, 0.0f); 
    lightPosition.put(2, 0.0f); 
    lightPosition.put(3, 1.0f); 

    lightDir.put(0, 0.0f); 
    lightDir.put(1, 0.0f); 
    lightDir.put(2, 0.0f); 
    lightDir.put(3, 1.0f); 

    GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, lightAmbient); // Setup The Ambient Light 
    GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, lightDiffuse); // Setup The Diffuse Light 
    GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, lightDir); 
    GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, lightPosition); // Position The Light 
    GL11.glEnable(GL11.GL_LIGHT1); // Enable Light One 

    if (light) // Enable/Disable Lighting 
     GL11.glEnable(GL11.GL_LIGHTING); 
    else 
     GL11.glDisable(GL11.GL_LIGHTING); 

    /* Initiating loader classes */ 

    new ColorList(); 
    new TextureManager(); 
    new TimersManager(); 
    lvLoader = new LevelLoader(); 

    GL11.glBindTexture(GL11.GL_TEXTURE_2D, TextureManager.getInstance().atlases[0].getTextureID()); 

    /* Initiating variables */ 
    lastFPS = getTime(); 

    /* Setting the spawn point */ 
    xpos = spawnPoint.x; 
    zpos = spawnPoint.z; 

    /* Loading a new level */ 
    loadLevel("testmap"); 

    /* Build static display lists */ 
    buildLists(); 

    //create the font 
    Font awtFont = new Font("Times New Roman", Font.BOLD, 24); 
    font = new TrueTypeFont(awtFont, false); 
} 

渲染代碼:

private void render() { 

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer 
    GL11.glLoadIdentity(); // Reset The View 

    GL11.glRotatef(lookupdown, 1.0f, 0, 0); 
    GL11.glRotatef(360.0f - yrot, 0, 1.0f, 0); 

    GL11.glTranslatef(-xpos, 0, -zpos); 

    GL11.glCallList(blocksList); 
    GL11.glCallList(tilesList); 
    GL11.glCallList(roofList); 

    TexCoords tc = null; 

    drawS(); 

    GL11.glBindTexture(GL11.GL_TEXTURE_2D, TextureManager.getInstance().atlases[0].getTextureID()); 

    /*     RENDERING BLOCKS      */ 
    for (Block block : lvLoader.currentLevel.blocks) 
    { 
     if (block.created) 
     {  
      if (!block.isStatic) 
      { 
       if (block.texturePos != null) 
       { 
        tc = getTexCoords(block.texturePos); 
       } 
       else 
       { 
        tc = new TexCoords(new Vertex(1.0f, 0.875f, 0), new Vertex(0.75f, 0.875f, 0), new Vertex(0.75f, 1.0f, 0), new Vertex(1.0f, 1.0f, 0)); 
       } 

       //GL11.glColor3b(block.color.getRedByte(), block.color.getGreenByte(), block.color.getBlueByte()); 
       GL11.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); 
       GL11.glBegin(GL11.GL_QUADS); 

       for (int i = 0; i < 6; i++) 
       { 
        quadNormal(i); 
        for (int j = 0; j < 4; j++) 
        { 
         Vertex coord = tc.coords[j]; 
         GL11.glTexCoord2d(coord.x, coord.y); 

         GL11.glVertex3f(block.walls[i].vertices[j].x, block.walls[i].vertices[j].y, block.walls[i].vertices[j].z); 
        } 
       } 

       GL11.glEnd(); 
      } 
     } 
    } 


    /*     RENDERING TILES      */ 
    for (Tile tile : lvLoader.currentLevel.tiles) 
    { 
     if (tile.created) 
     { 
      if (!tile.isStatic) 
      { 
       if (tile.animation != null) 
       { 
        tile.texturePos = tile.animation.frames[tile.animation.currentFrame]; 
        tc = getTexCoords(tile.texturePos); 
       } 
       else 
       { 
        if (tile.texturePos != null) 
        { 
         tc = getTexCoords(tile.texturePos); 
        } 
        else 
        { 
         tc = new TexCoords(new Vertex(1.0f, 0.875f, 0), new Vertex(0.75f, 0.875f, 0), new Vertex(0.75f, 1.0f, 0), new Vertex(1.0f, 1.0f, 0)); 
        } 
       } 

       GL11.glColor3b(tile.color.getRedByte(), tile.color.getGreenByte(), tile.color.getBlueByte()); 
       //GL11.glColor4f(0, 0, 1.0f, 1.0f); 
       GL11.glBegin(GL11.GL_QUADS); 

       quadNormal(5); 
       for (int jj = 0; jj < 4; jj++) 
       { 
        Vertex coord = tc.coords[jj]; 
        GL11.glTexCoord2f(coord.x, coord.y); 

        GL11.glVertex3f(tile.surface.vertices[jj].x, tile.surface.vertices[jj].y, tile.surface.vertices[jj].z); 
       } 



       GL11.glEnd(); 
      } 
     } 
    } 


    /*     RENDERING ROOF      */ 
    for (Tile rTile : lvLoader.currentLevel.roof) 
    { 
     if (rTile != null) 
     { 
      if (rTile.created) 
      { 
       if (!rTile.isStatic) 
       { 
        if (rTile.texturePos != null) 
        { 
         tc = getTexCoords(rTile.texturePos); 
        } 
        else 
        { 
         tc = new TexCoords(new Vertex(1.0f, 0.875f, 0), new Vertex(0.75f, 0.875f, 0), new Vertex(0.75f, 1.0f, 0), new Vertex(1.0f, 1.0f, 0)); 
        } 
        GL11.glColor3ub(rTile.color.getRedByte(), rTile.color.getGreenByte(), rTile.color.getBlueByte()); 
        GL11.glBegin(GL11.GL_QUADS); 

        quadNormal(4); 
        for (int k = 0; k < 4; k++) 
        { 
         Vertex coord = tc.coords[k]; 
         GL11.glTexCoord2f(coord.x, coord.y); 

         GL11.glVertex3f(rTile.surface.vertices[k].x, rTile.surface.vertices[k].y, rTile.surface.vertices[k].z); 
        } 

        GL11.glEnd(); 
       } 
      } 
     } 
    } 
} 

其他方法:

private void drawS() 
{ 
    // disable depth testing and enable orthographic view 
    GL11.glDisable(GL11.GL_DEPTH_TEST); 
    // GL11.glDepthMask(false); 
    enableOrthoView(); 

    // draw the credits 
    GL11.glDisable(GL11.GL_LIGHTING); 
    font.drawString(20.0f, 20.0f, "Test string qqqqqqqqqqqqqqqqqqqq ", Color.green); 
    GL11.glEnable(GL11.GL_LIGHTING); 

    // go back to the model view 
    GL11.glEnable(GL11.GL_DEPTH_TEST); 
    // GL11.glDepthMask(true); 
    disableOrthoView(); 
} 

/** 
* Enables orthographic view. 
*/ 
public static void enableOrthoView(){    // Set Up An Ortho View 
    GL11.glMatrixMode(GL11.GL_PROJECTION);  // Select Projection 
    GL11.glPushMatrix();  // Push The Matrix 
    GL11.glLoadIdentity();  // Reset The Matrix 
    GL11.glOrtho(0, 800 , 600 , 0, -1, 1); // Select Ortho Mode 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select Modelview Matrix 
    GL11.glPushMatrix(); // Push The Matrix 
    GL11.glLoadIdentity(); // Reset The Matrix 
} 

/** 
* Disables the orthographic view. 
*/ 
public static void disableOrthoView() { 
    GL11.glMatrixMode(GL11.GL_PROJECTION); // Select Projection 
    GL11.glPopMatrix(); // Pop The Matrix 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select Modelview 
    GL11.glPopMatrix(); // Pop The Matrix 
} 

輸出看起來是這樣的:image 1(這似乎與我的水質地紋理化)

還是這個樣子,如果我繪製文本之前禁用紋理:image 2

我在做什麼錯?

回答

5

TrueType字體被拒絕。改用UnicodeFont。

font = new UnicodeFont(awtFont); 
    font.getEffects().add(new ColorEffect(java.awt.Color.white)); 
    font.addAsciiGlyphs(); 
    try { 
     font.loadGlyphs(); 
    } catch (SlickException ex) { 
     // Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); 
    } 

這應該有助於