Pregunta

Estoy tratando de cargar una textura para un cubo y tengo problemas con las dimensiones que uso. La textura tiene el poder de dos (256x256). Cuando debe usar 256 como ancho y altura, arroja una excepción:

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

El código:

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

Cuando cambio el ancho del parámetro/altura a 128, la excepción desaparece, pero los cubos muestran colores incorrectos:

enter image description here

Como Bestsss mencionó, la razón podría ser un formato crudo. El problema: no puedo solucionar esto. Probé varias imágenes y formatos. Los creó con GIMP (trabajando en Ubuntu) pero la excepción siempre es la misma. Así que supongo que la razón de eso es que leo la imagen de manera incorrecta. ¿Algunas ideas?

Actualizar

Mi solución (que utiliza clases JOGL textureio y textura):

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
}
¿Fue útil?

Solución

Sin embargo, cero pista sobre la API. Puedo apostar que el formato esperado es un crudo No gif desde 262144 = 2^18 (o 256*256*4). RGB+alfa son 4 bytes.

Editar: de nuevo,gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);

Simplemente adivinando pero mire las constantes: GL2ES2.GL_RGBA, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE - Todos los compatibles con el formato RGBA para los bytes en el amortiguador de bytes, vea lo que otros concursantes están disponibles, la forma en que creo que usar NIO solo tendrá puntos con punto con directo Buffers que contienen el ráster en el formato especificado por las constantes. (es decir, ningún otro formato para el almacenamiento/transmisión de imágenes como JPEG/BIF/PNG ayudará)

Así que lea la documentación nuevamente, busque tutoriales, ejemplos y proceda (la forma en que carga la imagen tampoco es muy buena)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top