Domanda

Sto cercando di caricare una texture per un cubo e mi hanno problemi con le dimensioni che uso. La texture ha il potere di due (256x256). Quando si dovrebbe usare 256 come larghezza e l'altezza viene generata un'eccezione:

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

Il codice:

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);
}

Quando cambio la larghezza parametro / altezza per 128 le scompare eccezione, ma i cubetti di mostrare colori sbagliati:

entrare descrizione dell'immagine qui

Come bestsss detto, il motivo potrebbe essere qualche formato raw. Il problema: non riesco a risolvere questo. Ho provato le immagini e formati multipli. li ha creati con GIMP (lavorando su ubuntu), ma l'eccezione è sempre lo stesso. Quindi credo che la ragione di ciò è che ho letto l'immagine in un modo sbagliato. Alcune idee?

Aggiorna

La mia soluzione (che utilizza le classi JOGL TextureIO e la struttura):

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
}
È stato utile?

Soluzione

indizio

Zero sulle API comunque. Posso scommettere il formato previsto è qualcuno grezzo NON gif dal 262144 = 2 ^ 18 (o 256 * 256 * 4). RGB + Alpha sono 4bytes.

modifica: ancora una volta, gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);

solo guessting ma a guardare le costanti: GL2ES2.GL_RGBA, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE - tutti i formati di supporto RGBA per i byte nel buffer di byte, vedere quali sono disponibili altri concorrenti, il modo in cui io credo usando NIO avrebbe punto solo con diretta tamponi contenenti il ??raster nel formato specificato dalle costanti. (Vale a dire non altri formati per la conservazione / trasmissione come immagine jpeg / BIF / png vi aiuterà)

Quindi, leggere la documentazione di nuovo, cercare di tutorial, esempi e procedere (il modo in cui si carica l'immagine non è molto buono)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top