Frage

Ich versuche, eine Textur für einen Würfel zu laden, und ich habe Probleme mit den Abmessungen, die ich verwende. Die Textur hat die Leistung von zwei (256x256). Wenn es 256 als Breite und Höhe verwenden sollte, macht es eine Ausnahme:

java.lang.IndexOutOfBoundsException: Required 262144 remaining bytes in buffer, only had 68998
    at com.jogamp.common.nio.Buffers.rangeCheckBytes(Buffers.java:828)

Der Code:

private void initTexture(GL2ES2 gl) {
try {
    BufferedImage bufferedImage = ImageIO.read(new URI("http://192.168.0.39/images/box.gif").toURL());
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "gif", byteArrayOutputStream);
    byte[] imageData = byteArrayOutputStream.toByteArray();
    imageBuffer = ByteBuffer.wrap(imageData);
} catch (Exception e) {
    e.printStackTrace();
}
imageBuffer.rewind();
gl.glGenTextures(1, textureIds, 0);
gl.glBindTexture(GL2ES2.GL_TEXTURE_2D, textureIds[0]);
gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);
gl.glTexParameteri(GL2ES2.GL_TEXTURE_2D, GL2ES2.GL_TEXTURE_MAG_FILTER, GL2ES2.GL_LINEAR);
gl.glTexParameteri(GL2ES2.GL_TEXTURE_2D, GL2ES2.GL_TEXTURE_MIN_FILTER, GL2ES2.GL_LINEAR_MIPMAP_NEAREST);
gl.glGenerateMipmap(GL2ES2.GL_TEXTURE_2D);
gl.glBindTexture(GL2ES2.GL_TEXTURE_2D, 0);
}

Wenn ich die Parameterbreite/Höhe auf 128 ändere, verschwindet die Ausnahme, aber die Würfel zeigen falsche Farben:

enter image description here

Wie Bests erwähnt, könnte der Grund für ein Rohformat sein. Das Problem: Ich kann das nicht beheben. Ich habe mehrere Bilder und Formate ausprobiert. Erstellt sie mit GIMP (Arbeit an Ubuntu), aber die Ausnahme ist immer die gleiche. Ich denke, der Grund dafür ist, dass ich das Bild falsch gelesen habe. Einige Ideen?

Aktualisieren

Meine Lösung (die Jogl -Klassen Textureio und Textur verwendet):

Texture texture;

private void initTexture(GL2ES2 gl) {
    try {
        texture = TextureIO.newTexture(new URI("http://192.168.0.39/images/box.gif").toURL(),true,null);
        texture.setTexParameterf(GL2ES2.GL_TEXTURE_MIN_FILTER, GL2ES2.GL_LINEAR_MIPMAP_LINEAR);
        texture.setTexParameterf(GL2ES2.GL_TEXTURE_MAG_FILTER, GL2ES2.GL_LINEAR);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void display(GL2ES2 gl) {
    // code snipped
    if (texture != null) {
        texture.enable();
        texture.bind();
    }
    // code snipped
}
War es hilfreich?

Lösung

Null Hinweis auf die API jedoch. Ich kann wetten, dass das erwartete Format ein rohes ist Nicht gif seit 262144 = 2^18 (oder 256*256*4). RGB+Alpha sind 4bytes.

Bearbeiten: Wieder,gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);

Ich rate nur an, aber schauen Sie sich die Konstanten an: GL2ES2.gl_RGBA, GL2ES2.GL_RGBA, GL2ES2.GL_UNsigned_Byte - Alle unterstützen das RGBA Direkte Puffer, die den Raster im von den Konstanten angegebenen Format enthalten. (dh keine anderen Formate für Bildspeicher/Getriebe wie JPEG/BIF/PNG hilft)

Lesen Sie also die Dokumentation erneut, suchen Sie nach Tutorial, Beispielen und fahren Sie fort (so wie Sie das Bild laden, ist auch nicht sehr gut)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top