java - LWJGL - 文本颜色改变背景颜色

标签 java opengl lwjgl

我的 LWJGL 程序存在严重问题。 如果我设置其中一种文本的颜色,背景的颜色也会改变。
我想我知道为什么,我只是将所有绘图内容放入无限循环中,也许这就是原因。你能帮我解决这个问题吗?我对问题原因的理解正确吗?如果是,我该如何解决?如果不是,你觉得怎么样,问题出在哪里? 这是我的代码:
主类:

<!-- language: lang-java -->
public class DoomMain {
public static final int WIDTH = 640;
public static final int HEIGHT = 480;
public static final int SCALE = 1;

private static State state;

public DoomMain() {
    try {
        Display.setDisplayMode(new DisplayMode(WIDTH*SCALE,HEIGHT*SCALE));
        Display.setTitle("Tomco - Doom");
        Display.create();
    } catch(LWJGLException e) {
        e.printStackTrace();
    }

    while(!Display.isCloseRequested()) {                            
        state = State.MENU;     

        switch(state) {
            case INTRO:
                new Intro();
                break;
            case MENU:
                new MainMenu();
                break;
            case CREDITS:
                break;
            case GAME:
                break;
            default:
                break;
        }

        Display.update();
        Display.sync(60);
    }

    Display.destroy();
}


public static void main(String[] args) {
    new DoomMain(); 
}
}

MainMenu 类:

<!-- language: lang-java -->
public class MainMenu {

private Texture background;
private TrueTypeFont doomfont;

private boolean ana = false;

public MainMenu()  {                
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glEnable(GL11.GL_BLEND);
    glBlendFunc(GL11.GL_SRC_ALPHA,GL11.GL_ONE_MINUS_SRC_ALPHA);
    glViewport(0,0,DoomMain.WIDTH,DoomMain.HEIGHT);
    glMatrixMode(GL11.GL_MODELVIEW);
    glMatrixMode(GL11.GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,DoomMain.WIDTH,DoomMain.HEIGHT,0,1,-1);
    glMatrixMode(GL11.GL_MODELVIEW);    
    glShadeModel(GL_SMOOTH);

    drawBackground();
    drawText();
    glDisable(GL_TEXTURE_2D);
}

private void drawBackground() {
    try {
        background = TextureLoader.getTexture("PNG",new FileInputStream(new File("res/textures/mainmenu/doom_00340461.png")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Display.destroy();
    } catch (IOException e) {
        e.printStackTrace();
        Display.destroy();
    }

    glBegin(GL_QUADS);
    {
        glTexCoord2f(0,0);
        glVertex2f(0,0);
        glTexCoord2f(1,0);
        glVertex2f(background.getTextureWidth(),0); 
        glTexCoord2f(1,1);
        glVertex2f(background.getTextureWidth(),background.getTextureHeight());
        glTexCoord2f(0,1);
        glVertex2f(0,background.getTextureHeight());
    }
    glEnd();
}

private void drawText() {
    Color.white.bind();
    try {
        InputStream inputStream = ResourceLoader.getResourceAsStream("res/fonts/DooM.ttf");
        Font awtFont = Font.createFont(Font.TRUETYPE_FONT,inputStream);
        awtFont = awtFont.deriveFont(24f);
        doomfont = new TrueTypeFont(awtFont,ana);
    } catch(Exception e) {
        e.printStackTrace();
    }

    doomfont.drawString(200,100,"Start new game",Color.red);
}
}

最佳答案

默认情况下,纹理将乘以当前颜色。作为状态机,“当前颜色”是您最后设置的颜色。就您而言,当您绘制文本时;当您再次进入循环时,纹理将使用相同的颜色。

为了简化问题,您可以将整个drawText例程简化为仅设置颜色:

LOOP:
    a) draw background
    b) set color

结果:...设置颜色;绘制背景...

glClear 函数清除缓冲区中已绘制的内容,但不会清除接下来要使用的颜色。

作为解决方案,您可以在绘制纹理之前显式更改颜色。 glColor3f(1.0f, 1.0f, 1.0f) 将按原样生成纹理,任何其他值都将用作颜色滤镜(就像现在一样)。

另一个解决方案是使用 glTexEnv 更改纹理绘制行为。假设纹理是 GL_RGBA,则调用 glTexEnv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) 有效。链接页面包含一个表格,其中包含不同的设置及其效果。

关于java - LWJGL - 文本颜色改变背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013216/

相关文章:

java - 我可以使用 jOOX 查找属性的 xPath 吗?

python OpenGL.error.NullFunctionError glGenBuffers

java - 使用着色器时纹理不渲染?

Ubuntu 14.10 台面 10.1.3 中的 OpenGL GLSL 3.30

java - 线程中出现异常 "main"java.lang.UnsatisfiedLinkError : no lwjgl-devil in java. library.path

java - 我们可以在 Java 中将字节数组转换为 InputStream 吗?

java - 为什么有些节点有 x 和 y 位置而其他节点没有

java - 在 DOM 中使用 mongodb 对象的 _id 值是个好主意吗?

c++ - 在 openGL/GLUT 中绘制多个形状

c++ - vector 中 GPU 的骨骼权重