2013-02-06 82 views
0

使用LWJGL和OpenGL,我想畫一個帶紋理的矩形。 除此之外,我想用Slick Library編寫一些文本。 我的問題是,當我在矩形之前繪製文本時,字體具有透明背景。見這裏:字體背後的透明背景

enter image description here

如果我繪製矩形之後的文本,我不能看到它。現在我已經搜索了一個小時左右,發現了幾種可能的解決方案,但都沒有爲我工作。

驗證碼:

FontVeranda.java

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package bunchofpunch.fonts; 

import java.nio.FloatBuffer; 
import org.lwjgl.opengl.GL11; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.UnicodeFont; 
import org.newdawn.slick.font.effects.ColorEffect; 

/** 
* 
* @author Alex 
*/ 
public class FontVeranda 
{ 
    private UnicodeFont font; 
    private boolean shouldRenderFont = true; 

    public void loadFont() 
    { 
     java.awt.Font awtFont = new java.awt.Font("Veranda", java.awt.Font.BOLD, 14); 
     font = new UnicodeFont(awtFont); 
     font.getEffects().add(new ColorEffect(java.awt.Color.black)); 
     font.addAsciiGlyphs(); 
     try { 
      font.loadGlyphs(); 
     } catch (SlickException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
    } 

    public void toggleRender() 
    { 
     if(shouldRenderFont){ 
      shouldRenderFont = false; 
     }else{ 
      shouldRenderFont = true; 
     } 
    } 
    public void toggleRender(boolean doRender) 
    { 
     shouldRenderFont = doRender; 
    } 

    public void renderFont(float x, float y, String text, FloatBuffer orthographicProjectionMatrix, FloatBuffer perspectiveProjectionMatrix) 
    { 
     if(!shouldRenderFont) { return; } 

     GL11.glMatrixMode(GL11.GL_PROJECTION); 
     GL11.glLoadMatrix(orthographicProjectionMatrix); 
     GL11.glMatrixMode(GL11.GL_MODELVIEW); 

      GL11.glPushMatrix(); 

       GL11.glLoadIdentity(); 
       GL11.glDisable(GL11.GL_LIGHTING); 

       font.drawString(x, y, text); 

       GL11.glEnable(GL11.GL_LIGHTING); 

      GL11.glPopMatrix(); 

     GL11.glMatrixMode(GL11.GL_PROJECTION); 
     GL11.glLoadMatrix(perspectiveProjectionMatrix); 
     GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    } 
} 

那我怎麼稱呼它:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package bunchofpunch.game; 

import bunchofpunch.fonts.FontVeranda; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.lwjgl.LWJGLException; 
import static org.lwjgl.opengl.GL11.*; 
import org.lwjgl.opengl.GLContext; 

/** 
* 
* @author Alex 
*/ 
public class GameScreenHUD extends GameScreen 
{ 
    float space = 20f; 
    float width = 250f; 
    float height = 200f; 

    World world; 

    public GameScreenHUD(World world){this.world = world;} 

    @Override 
    public void renderScreen() { 

     //this is a instace of "FontVeranda.java" 
     world.font.renderFont(Game.WIDTH-width+50, Game.WIDTH-height-space-160, "My Text is here", 
     World.orthographicProjectionMatrix, World.perspectiveProjectionMatrix); 

     glMatrixMode(GL_PROJECTION); 
     glLoadMatrix(World.orthographicProjectionMatrix); 
     glMatrixMode(GL_MODELVIEW); 

      glPushMatrix(); 

       glLoadIdentity(); 
       glDisable(GL_LIGHTING); 

       TextureManager.hud.bind(); 

       glBegin(GL_QUADS); 

        glTexCoord2f(0, 1); 
        glVertex2f(Game.WIDTH-space-width, Game.HEIGHT-space); 
        glTexCoord2f(1, 1); 
        glVertex2f(Game.WIDTH-space, Game.HEIGHT-space); 
        glTexCoord2f(1,0); 
        glVertex2f(Game.WIDTH-space, Game.HEIGHT-height-space); 
        glTexCoord2f(0, 0); 
        glVertex2f(Game.WIDTH-space-width, Game.HEIGHT-height-space); 

       glEnd(); 

       glEnable(GL_LIGHTING); 

      glPopMatrix(); 

     glMatrixMode(GL_PROJECTION); 
     glLoadMatrix(World.perspectiveProjectionMatrix); 
     glMatrixMode(GL_MODELVIEW); 
    } 

} 
+0

我不太明白這應該如何幫助我。我沒有透明區域。我相信這個問題與Slick字體渲染方法有關。 – DealerJoe

+0

從我看到的內容來看,我會說在調用字體繪製例程之前,您沒有正確設置背景/背景顏色。字體繪製例程可能只是採用當前緩衝的背景顏色並應用它。此外,我不知道你是在什麼模式,你是否有4個顏色通道的alpha混合,或者在3個顏色通道等工作?這可能是因爲您正在使用關閉alpha混合的24位彩色模式。 – trumpetlicks

回答

0

的問題是,繪製文本與應用到每個字母紋理四方。任何透明對象都必須繪製在它們前面的對象之後。改變繪製順序以最後繪製文本是唯一的好方法。基本上,你已經找到了解決方案。第二個繪製文本。雖然有一些方法可以在首先繪製文本時獲得所需效果,但我並不推薦它們。