2012-04-12 3 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. Генерация текстуры имя/ID с glGenTextures - сохранить этот идентификатор в переменной
  2. Bind этот идентификатор, используя glBindTexture
  3. любой только тогда вы можете загрузить данные с glTexImage

В коде чертежа вы вызываете всю нагрузку на текстуру, что неэффективно, и каждый раз вы воссоздаете новое имя текстуры. Используйте карту для сопоставления имен файлов текстур с идентификатором, и только если ни один идентификатор не был назначен, Gen/Bind/TexImage - текстура. В противном случае просто привяжите его.

+0

Нет, это не сработало –

+0

Ну, вам также необходимо включить текстурирование. glEnable (GL_TEXTURE_2D) - вызовите его прямо перед glBegin – datenwolf

Смежные вопросы