ByteBuffer is not direct

Helgon

Bekanntes Mitglied
Hey, ich hab folgendes Problem

Ich brauch als Prameter einen ByteBuffer aber hab nur einen Byte Array

Also dacht ich einfach wrapen.


Java:
	ByteBuffer dataByteBuffer = ByteBuffer.wrap(t1.getTextureData());
/* Mein Ansatz den ich per google gefunden habe, gleiche Fehlermeldung weiterhin :/
		System.out.println(dataByteBuffer.isDirect());
		dataByteBuffer.allocate(t1.getTextureData().length);
		System.out.println(dataByteBuffer.isDirect()); // trotzdem false
*/
		glBindTexture(GL_TEXTURE_2D, t1.getTextureID());
		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, 3, (int)t1.getWidth(), (int)t1.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, dataByteBuffer);

Zeile 10 schmeißt den Error, letzer Parameter

Java:
Exception in thread "main" java.lang.IllegalArgumentException: ByteBuffer is not direct
	at org.lwjgl.BufferChecks.checkDirect(BufferChecks.java:115)
	at org.lwjgl.BufferChecks.checkBuffer(BufferChecks.java:231)
	at org.lwjgl.opengl.GL11.glTexImage2D(GL11.java:2811)
	at nehe.Lektion2.load(Lektion2.java:186)
	at nehe.Lektion2.<init>(Lektion2.java:47)
	at nehe.Lektion2.main(Lektion2.java:203)

Hat wer ne Idee worans liegt/was ich machen kann?

Grüße
 

Helgon

Bekanntes Mitglied
Habs auch mim allocateDirect probiert, bringt leider auch nichts :(. Gleicher Fehler wie zuvor, egal was ich als Capacity angebe, ob die tatsächliche Länge des Byte Arrays oder einfach mal 5x so viel :/

EDIT!

Ich habs eben (vorm Post hier) auch mit allocateDirect probiert, aber da gings nicht. Ich hab jetzt mal alles in eine Zeile gepackt und es FUNKTIONIERT!

Frag mich nicht warum, aber ich bin glücklich. Danke für die Idee, hat mich nochmal zum nachdenken angeregt :toll:

Java:
		ByteBuffer dataByteBuffer = ByteBuffer.wrap(t1.getTextureData()).allocateDirect(t1.getTextureData().length);
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das allocateDirect ist eine static methode, d.h. das was dort steht sollte das gleiche sein wie
Java:
ByteBuffer dataByteBuffer = ByteBuffer.allocateDirect(t1.getTextureData().length);

Allerdings dürfte dieser Buffer (genauso wie der, den du erstellst) erstmal leer sein, solange man nicht danach irgendwas mit
Java:
dataByteBuffer.put(t1.getTextureData());
dataByteBuffer.rewind();
oder so aufruft...
 

Helgon

Bekanntes Mitglied
Da steht doch

Java:
    ByteBuffer dataByteBuffer = ByteBuffer.wrap(t1.getTextureData()).allocateDirect(t1.getTextureData().length);

?

Der ist doch nicht leer :)
 

musiKk

Top Contributor
Da steht doch

Java:
    ByteBuffer dataByteBuffer = ByteBuffer.wrap(t1.getTextureData()).allocateDirect(t1.getTextureData().length);

?

Der ist doch nicht leer :)

Was Marco13 meint: Die Methode [c]allocateDirect()[/c] ist statisch. Was hier passiert ist ein statischer Methodenaufruf über ein Objekt, was 1. eine Warnung produzieren und 2. einen neuen unabhängigen [c]ByteBuffer[/c] erzeugen sollte.
 

Ähnliche Java Themen

Neue Themen


Oben