Caricamento consistenza non funziona con la giusta consistenza larghezza / altezza
-
25-10-2019 - |
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:
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
}
Soluzione
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 ??em> 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)