LWJGL не будет работать с байтбуфером, но будет работать с плавающим массивом

#java #opengl #lwjgl

#java #opengl #lwjgl

Вопрос:

Я пытаюсь отобразить текстуру через LWJGL:

 glBindTexture(GL_TEXTURE_2D, textureId);

            BufferedImage img = null;

            img = ImageIO.read(new File(filePath));

            Raster imgRaster = img.getData();

            DataBufferByte imgBuffer = (DataBufferByte) imgRaster.getDataBuffer();

            ByteBuffer byteBuffer = ByteBuffer.wrap(imgBuffer.getData());

            //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1,1, 0, GL_RGB, GL_FLOAT, new float[]{1f,0f,1f});
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.getWidth(), img.getHeight(), 0,
                         GL_RGB, GL_UNSIGNED_BYTE, byteBuffer);

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  

Однако текстура полностью черная (насколько я могу судить, ошибок нет). В отладчике я проверил, что в байтбуфере действительно есть данные (достаточные для учета текстуры того размера, который я предоставил), поэтому я должен хотя бы что-то увидеть.

Однако, если я быстро добавлю несколько чисел с плавающей запятой в массив и передам его в glTexImage2D:

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1,1, 0, GL_RGB, GL_FLOAT, new float[]{1f,0f,1f});
  

Фигура на экране внезапно становится пурпурной.

В прошлом у меня были проблемы с этими * буферами, и замена их массивами всегда, казалось, работала.

Нужно ли мне что-то делать с байтбуфером, чтобы заставить его работать?

Комментарии:

1. После того, как вы поместили данные в байтбуфер, пытались перевернуть буфер, чтобы сбросить его обратно для чтения? Еще один вопрос: вы уверены, что тип данных буфера данных, который вы извлекаете из растра, соответствует 3-байтовому формату RGB?

2. Я полагаю, вы имеете в виду byteBuffer.flip() (сразу после вызова wrap())? Похоже, это не помогло. Кроме того, если я использую неправильный формат, я должен хотя бы что-то увидеть, верно? Не просто черный квадрат?

3. Не уверен, что это оптимально, но когда я загружаю изображения через BufferedImage, я сначала создаю массив int[] шириной * высотой изображения, а затем считываю с помощью img.getRGB(0,0, ширина, высота, данные, 0, ширина). Затем, поскольку загружаемые изображения находятся в формате ARGB, я перемещаю альфа-байт в конец, делая его RGBA. Затем я создаю байтбуфер размером width * height * 4, устанавливаю порядок байтов. BIG_ENDIAN, затем выполните buffer.asIntBuffer().put(данные). Наконец, я делаю buffer.flip() . Я создаю изображение с помощью glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ширина, высота, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

4. Это действительно уродливо, вроде того, что я в итоге сделал. Я просто перебрал все координаты x / y и превратился в массив типа, который LWJGL принимает напрямую. Тем не менее, я не понимаю, почему ByteByffer просто не будет работать.