OpenGL不会绑定我的纹理

时间:2012-04-12 09:50:44

标签: java opengl bufferedimage

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

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();
}

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

1 个答案:

答案 0 :(得分:2)

你的订单完全错了。你需要:

  1. 使用glGenTextures生成纹理名称/ ID - 将该ID存储在变量
  2. 使用glBindTexture
  3. 绑定该ID
  4. 任何只有你可以用glTexImage上传数据
  5. 在您的绘图代码中,您调用的是整个纹理加载,效率很低,每次都会重新创建一个新的纹理名称。使用地图将纹理文件名映射到ID,并且只有在尚未分配ID的情况下,才能对纹理进行Gen / Bind / TexImage。否则,只需绑定它。