Java-LWJGL加载纹理,只有我加载的最新纹理有效

Java-LWJGL加载纹理,只有我加载的最新纹理有效,java,3d,textures,lwjgl,Java,3d,Textures,Lwjgl,我正在用LWJGL创建一个游戏,我目前正在实现纹理。(3D) 当我使用我的方法只加载一个纹理时,效果很好,但如果加载两个或更多纹理,则只有我加载的最新纹理处于活动状态,我只能使用该纹理 查看代码,您将了解: 我加载纹理的方法: private int[] loadRTexture(String filename) { int[] twh = new int[3]; ByteBuffer buf = null; int tWidth = 0; int tHeight

我正在用LWJGL创建一个游戏,我目前正在实现纹理。(3D) 当我使用我的方法只加载一个纹理时,效果很好,但如果加载两个或更多纹理,则只有我加载的最新纹理处于活动状态,我只能使用该纹理

查看代码,您将了解:

我加载纹理的方法:

private int[] loadRTexture(String filename) {
    int[] twh = new int[3];
    ByteBuffer buf = null;
    int tWidth = 0;
    int tHeight = 0;

    try {
        // Open the PNG file as an InputStream
        InputStream in = new FileInputStream(filename);
        // Link the PNG decoder to this stream
        PNGDecoder decoder = new PNGDecoder(in);

        // Get the width and height of the texture
        tWidth = decoder.getWidth();
        tHeight = decoder.getHeight();
        twh[1] = tWidth;
        twh[2] = tHeight;   

        // Decode the PNG file in a ByteBuffer
        buf = ByteBuffer.allocateDirect(
                4 * decoder.getWidth() * decoder.getHeight());
        decoder.decode(buf, decoder.getWidth() * 4, Format.RGBA);
        buf.flip();

        in.close();
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(-1);
    }

    // Create a new texture object in memory and bind it
    int texId = GL11.glGenTextures();
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texId);

    // All RGB bytes are aligned to each other and each component is 1 byte
    GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);

    // Create a new texture object in memory and bind it    
    // Upload the texture data and generate mip maps (for scaling)
    GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, tWidth, tHeight, 0, 
            GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf);
    GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);

    // Setup the ST coordinate system
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);

    // Setup what to do when the texture has to be scaled
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, 
            GL11.GL_NEAREST);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, 
            GL11.GL_LINEAR_MIPMAP_LINEAR);
    twh[0] = texId;
    return twh;
}
我存储生成的int-texId=GL11.glGenTextures();在使用此方法后的arraylist中

然后,当我要渲染时,这就是我绑定纹理的方式:

GL11.glBegin(GL11.GL_QUADS); // Start Drawing The Cube
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, game.getResourceManager().getTextures().get(game.getResourceManager().getSpriteSheets().get(0).getTextureID()));
    GL11.glTexCoord2f(x, y);
    GL11.glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Top)
    GL11.glTexCoord2f(x, y+celly);
    GL11.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top)
    GL11.glTexCoord2f(x+cellx, y+celly);
    GL11.glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
    GL11.glTexCoord2f(x+cellx, y);
    GL11.glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
这一行:

game.getResourceManager().getTextures().get(game.getResourceManager().getSpriteSheets().get(0).getTextureID())
获取生成的所需纹理int。。(它得到了正确的一个,我已经检查过了。)


那么为什么会发生这种情况呢

如果您的纹理加载程序有问题,请在此处试用我的:


如果您确实不想,请将您的代码与我的代码进行比较,看看是否有任何错误。

在调用glBegin后,您无法绑定纹理。这会把一切搞砸,

通过添加glBindTexture(GL\u TEXTURE\u 2D,0)解决;在加载纹理方法中,通过添加glBindTexture(GL_texture_2D,0)求解;在加载纹理方法中哦,哎呀,我不知道在主线程的评论中是你。无论如何,如果你仍然有困难,你可以尝试我的纹理加载器。