# Jogl Probleme mit dem Buffer beim laden einer Textur



## Nobbs (23. Jan 2010)

Moin Moin.

Ich schreibe nun seit geraumer Zeit an einem kleinen Jogl Projekt und wollte nun Texturen einbauen. Ich stoße zurzeit auf ein Problem dessen Ursache ich einfach nicht finden kann (ich bin neu in jogl), auch nach zahlreichen Vergleichen mit Quelltexten aus dem Netz. Ich benutze NetBeans als IDE

Ich lade zu Testzwecken den Inhalt eines 64*64 Pixel großen .tga Bildes in ein byte[] array (nur die Pixel byte[0]= alpha, byte[1]=red,byte[2]=green,...). Mit diesem Array erzeuge ich einen ByteBuffer und übergebe diesen an glTexImage2D();

In meiner init sieht der code so aus:



```
public void init(GLAutoDrawable glDrawable) {
    gl=glDrawable.getGL()

    gl.glEnable(GL.GL_DEPTH_TEST);
    gl.glEnable(GL.GL_COLOR);
    gl.glShadeModel(GL.GL_FLAT);
    gl.glEnable(GL.GL_TEXTURE_2D);

    Dimension d= new Dimension(0,0);
    byte[] im;

    try {
        //schreibt die pixel in im und speichert die Höhe und Breite des Bildes in Dimension d
        im = TargaReader.getImageAsByte("RandomTexture2.tga", d);
       
        //erzeugt ByteBuffer
        ByteBuffer imageBuffer = ByteBuffer.allocateDirect(im.length);
        imageBuffer.order(ByteOrder.nativeOrder());
        imageBuffer.put(im, 0, im.length);

        int id=createTextureID(gl);
        gl.glBindTexture(gl.GL_TEXTURE_2D, id);
    
        gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, nearest2Potenz(d.width),
                nearest2Potenz(d.height), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE,
                imageBuffer);

    } catch (IOException ex) {
        Logger.getLogger(Camera.class.getName()).log(Level.SEVERE, null, ex);
    }
    ...
}



private int createTextureID(GL gl)
{
   int[] tmp = new int[1];
   gl.glGenTextures(1, tmp,0);
   return tmp[0];
}
```


Folgende Fehlermeldung erscheint:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Required 16384 remaining bytes in buffer, only had 0
        at com.sun.gluegen.runtime.BufferFactory.rangeCheckBytes(BufferFactory.java:274)
        at com.sun.opengl.impl.GLImpl.glTexImage2D(GLImpl.java:21167)
        at...

Die 16384 bytes sind die 64*64*4(RGBA) bytes der Pixel. Wenn ich meinen ByteBuffer auf sein Limit untersuche bevor ich diesen an glTexImage2D übergebe, so ist er genau 16384 bytes groß. Wenn ich testweise ein paar Werte aus meinem byteBuffer entnehmen macht das auch keine Probleme. An der loadImage() methode des TargaReaders kann es auch nicht liegen, da ich wenn ich das byte[] Array einfach manuell mit einer for-Schleife fülle, den selben Fehler bekomme.

Übersehe ich einfach etwas essensielles? Danke für jede Antwort schonmal im voraus.

PS: meine GL Version ist 3.2.0


----------



## Guest2 (23. Jan 2010)

Moin,

habe es nur überflogen, aber ich denke in Zeile 20 fehlt schlicht ein


```
imageBuffer.rewind();
```

Gruß,
Fancy


----------



## Nobbs (23. Jan 2010)

Scheint auf den ersten Blick zu funktionieren. Habe schon echt lange daran gesessen und wunder mich, dass ich den rewind Befehl nicht vorher irgendwo gefunden oder gesehen habe. Kommt davon wenn man bytebuffer benutzt ohne sich  intensiver mit buffer auseinandergesetzt zu haben ^^.

Vielen vielen Dank.


----------

