光滑的纹理加载器和glBlendFunc干扰

时间:2014-12-19 22:32:08

标签: opengl lwjgl slick

我有关于LWJGL和Slick的问题

如果在启用Alpha混合的情况下使用Slick导入纹理,显示将停止渲染!

这是代码。一开始,它将呈现一个紫色方块。按下按钮T后,它将简单地导入纹理。虽然我从未真正绑定纹理,但屏幕仍然变黑!

这是我的代码:

import static org.lwjgl.opengl.GL11.GL_BLEND;

import java.io.IOException;

import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class Game {

public static void main(String[] args) throws Exception {
    Display.setDisplayMode(new DisplayMode(800, 600));
    Display.create();
    Game game = new Game();
    while (!Display.isCloseRequested()) {
        game.update();
    }
    game.close();
}

public Game() {
    initGL();

}

Texture boxTexture;

public void update() {
    clearGL();

    // Use the texture!
    GL11.glColor3f(0.4f, 0.2f, 0.9f);
    GL11.glBegin(GL11.GL_QUADS);

    GL11.glVertex2f(100, 100);

    GL11.glVertex2f(140, 100);

    GL11.glVertex2f(140, 140);

    GL11.glVertex2f(100, 140);
    GL11.glEnd();

    if(Keyboard.isKeyDown(Keyboard.KEY_T))
    {
        try {
            boxTexture = TextureLoader.getTexture("png",
                    ResourceLoader.getResourceAsStream("res/ps.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    Display.update();
}

public void close() {
    Display.destroy();
    System.exit(0);
}

public void initGL() {
    // Enable Alpha Blending
     GL11.glEnable(GL_BLEND);
     GL11.glBlendFunc(GL11.GL_SRC_ALPHA,GL11.GL_ONE_MINUS_SRC_ALPHA); 

    // Opengl init
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, 500, 0, 500, 1, -1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);

    // Enable textures
    GL11.glEnable(GL11.GL_TEXTURE_2D);
}

public void clearGL() {
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    GL11.glLoadIdentity();
}
}

1 个答案:

答案 0 :(得分:0)

TextureLoader.getTexture()绑定纹理。如果您查看Slick source code,您会在getTexture()类的InternalTextureLoader方法中找到以下行:

GL.glBindTexture(target, textureID);

它几乎必须绑定纹理,因为它需要调用像glTexImage2D()这样的函数来加载纹理。

因此,在调用此函数后,您实际上将使用纹理,因为您现在有一个纹理绑定,并且您在自己的代码中启用了纹理:

GL11.glEnable(GL11.GL_TEXTURE_2D);

要查看纹理图像,您需要执行其他步骤,例如指定纹理坐标。