-1

我已经解决了问题,以下是我的做法,

RenderEngine中的绑定代码:

public int bindTexture(String location)
{
    BufferedImage texture;
    File il = new File(location);

    if(textureMap.containsKey(location))
    {
        glBindTexture(GL_TEXTURE_2D, textureMap.get(location));
        return textureMap.get(location);
    }

    try 
    {
        texture = ImageIO.read(il); 
    }
    catch(Exception e)
    {
        texture = missingTexture;
    }

    try
    {
        int i = glGenTextures();
        ByteBuffer buffer = BufferUtils.createByteBuffer(texture.getWidth() * texture.getHeight() * 4);
        Decoder.decodePNGFileToBuffer(buffer, texture);
        glBindTexture(GL_TEXTURE_2D, i);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.getWidth(), texture.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
        textureMap.put(location, i);
        return i;
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

    return 0;
}

和PNG解码器方法:

public static void decodePNGFileToBuffer(ByteBuffer buffer, BufferedImage image)
{
    int[] pixels = new int[image.getWidth() * image.getHeight()];
    image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());

    for(int y = 0; y < image.getHeight(); y++)
    {
        for(int x = 0; x < image.getWidth(); x++)
        {
            int pixel = pixels[y * image.getWidth() + x];
            buffer.put((byte) ((pixel >> 16) & 0xFF));
            buffer.put((byte) ((pixel >> 8) & 0xFF));
            buffer.put((byte) (pixel & 0xFF)); 
            buffer.put((byte) ((pixel >> 24) & 0xFF));
        }
    }

    buffer.flip();
}

我希望这可以帮助任何有同样问题的人 PStextureMap只是一个 HashMap,其中 String 为键,Integer 为值

4

1 回答 1

2

你的顺序完全错了。你需要:

  1. 使用 glGenTextures 生成纹理名称/ID - 将该 ID 存储在变量中
  2. 使用 glBindTexture 绑定该 ID
  3. 只有这样您才能使用 glTexImage 上传数据

在您的绘图代码中,您正在调用整个纹理加载,这是低效的,而且您每次都在重新创建一个新的纹理名称。使用贴图将纹理文件名映射到 ID,并且仅在尚未分配 ID 时 Gen/Bind/TexImage 纹理。否则,只需绑定它。

于 2012-04-12T09:57:08.070 回答