#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 просто не будет работать.