2012-04-12 44 views
-1

我必须解决这个问题,以下是我做到了,的OpenGL不会绑定我的质地

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

我希望这可以帮助任何有同样问题的人 PS textureMap只是一个以字符串作为键值和整数值作为值的HashMap

回答

2

您已将命令完全错误。您需要:

  1. 生成具有glGenTextures纹理名称/ ID - 使用glBindTexture
  2. 任何只有这样,你可以用glTexImage
上传数据ID存储在一个变量
  • 绑定该ID

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

  • +0

    没有,那没有工作 – 2012-04-12 09:59:46

    +0

    那么,你还需要启用纹理。 glEnable(GL_TEXTURE_2D) - 在glBegin之前调用它 – datenwolf 2012-04-12 10:09:27