2013-02-06 59 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

的问题是,绘制文本与应用到每个字母纹理四方。任何透明对象都必须绘制在它们前面的对象之后。改变绘制顺序以最后绘制文本是唯一的好方法。基本上,你已经找到了解决方案。第二个绘制文本。虽然有一些方法可以在首先绘制文本时获得所需效果,但我并不推荐它们。