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:
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
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:
Java:
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