Question

Je suis en train de charger une texture pour un cube et j'ai du mal avec les dimensions que j'utilise. La texture a la puissance de deux (256x256). Quand il faut utiliser 256 comme la largeur et la hauteur, il déclenche une exception:

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

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

Quand je change la largeur du paramètre / hauteur à 128 d'exception jusqu'à la disparition, mais les cubes montrer les mauvaises couleurs:

entrer image description ici

Comme mentionné de la raison peut-être un format brut. Le problème: Je ne peux pas résoudre ce problème. J'ai essayé plusieurs images et les formats. ils ont été créés avec gimp (travail sur ubuntu), mais l'exception est toujours le même. Donc je suppose que la raison en est que je lis l'image d'une mauvaise façon. Quelques idées?

Mise à jour

Ma solution (qui utilise des classes JOGL TextureIO et texture):

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
}
Était-ce utile?

La solution

indice zéro sur l'API cependant. Je parie que le format attendu est quelqu'un brut NOT gif depuis 262144 = 2 ^ 18 (ou 256 * 256 * 4). RVB + Alpha sont 4bytes.

modifier: nouveau, gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);

juste guessting mais regardez les constantes: GL2ES2.GL_RGBA, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE - tout le soutien format RGBA pour les octets dans le tampon d'octets, voir ce que les autres concurrents sont disponibles, la façon dont je crois à l'aide NIO aurait seul point avec directement tampons contenant la trame dans le format spécifié par les constantes. (À savoir pas d'autres formats pour le stockage d'images / transmission comme jpeg / BIF / .png contribuera)

Alors lisez la documentation à nouveau, recherchez tutoriel, des exemples et procéder (la façon dont vous chargez l'image est pas très bon non plus)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top