Загрузка текстуры не работает с правильной шириной текстуры/высоты

StackOverflow https://stackoverflow.com/questions/4810886

Вопрос

Я пытаюсь загрузить текстуру для куба, и у меня возникли проблемы с размерами, которые я использую. Текстура имеет мощность двух (256x256). Когда он должен использовать 256 в виде ширины и высоты, он бросает исключение:

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

Код:

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

Когда я меняю ширину/высота параметра на 128, исключение исчезает, но кубики показывают неправильные цвета:

enter image description here

Как упоминалось Bestsss, причиной может быть необработанный формат. Проблема: я не могу это исправить. Я попробовал несколько изображений и форматов. Создал их с GIMP (работа над Ubuntu), но исключение всегда одинаково. Поэтому я думаю, что причина в том, что я неправильно читаю изображение. Некоторые идеи?

Обновлять

Мое решение (которое использует классы JOGL Textureio и текстуру):

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
}
Это было полезно?

Решение

Ноль подсказка об API, однако. Могу поспорить, что ожидаемый формат - какой -то сырой Не Gif с 262144 = 2^18 (или 256*256*4). RGB+Alpha - 4bytes.

РЕДАКТИРОВАТЬ: Опять же,gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);

Просто угадайте, но посмотрите на константы: gl2es2.gl_rgba, gl2es2.gl_rgba, gl2es2.gl_unsigned_byte - все поддерживают формат rgba для байтов в байтовом буфере, посмотрите, какие другие конкурсанты доступны, как я считаю, что использование Nio имеет только точки с непосредственный Буферы, содержащие растровый в формате, указанный константами. (т.е. нет других форматов для хранения/трансмиссии изображений, таких как JPEG/BIF/PNG не помогут)

Так что прочитайте документацию еще раз, ищите учебные пособия, примеры и продолжайте (как вы загружаете изображение, тоже не очень хорош)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top