2015-01-22 2 views
0

Я задумываюсь загрузить файл .ply в vbo и нарисовать его в lwjgl + java. Файл загружается правильно, и все данные обрабатываются правильно, единственная проблема заключается в том, что это модель с A LOT индексов (лиц). Индексы сохраняются в массиве byte []. В java (и, вероятно, везде) байты могут достигать 128, но индексы, необходимые для того, чтобы нарисовать сетку, превышают значение 128, поэтому я получаю эту ошибку.LWJGL чертеж большой сеткой

Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"128" Radix:10 
at java.lang.Byte.parseByte(Byte.java:151) at java.lang.Byte.parseByte(Byte.java:151) 
at game_3d.ModelLoader.loadGeometry(ModelLoader.java:333) 
at game_3d.Game_3D.setupGeometry(Game_3D.java:399) 
at game_3d.Game_3D.<init>(Game_3D.java:81) 
at game_3d.Game_3D.main(Game_3D.java:70) 

Когда я попытался использовать массив int [], модель не рисовала правильно. Я не знаю, как или если вы даже можете увеличить максимальное значение байта в массиве byte [], я уже пытался экспериментировать с radix, но минимум был 10 (что дает мне 128).

+0

ли это помочь вашей проблемы http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html – Rush2sk8

+0

Я дам ему вид @ Rush2sk8 – irishpatrick

+0

проблема все еще существует , Я сомневаюсь, что байтбуфер может использовать возможность использовать числа, превышающие 128, но я буду продолжать пытаться – irishpatrick

ответ

1

Ну, a byte - это байт. Он может иметь только 256 различных значений. При использовании привязок Java OpenGL существует небольшая странность, связанная с диапазоном индексов. Так как Java не имеет неподписанных типов данных, максимальное поддерживаемое значение может показаться равным 127. Но поскольку массивы значений byte будут переданы в собственный код, который будет обрабатывать их как значения без знака, максимальное количество вершин, на которые вы можете обратиться с byte индексов фактически 255.

Например, у вас есть значение 160 в качестве int, и приведения его в значение byte для хранения в byte[] массиве. Если вы посмотрите на значение byte на Java, оно, похоже, изменилось на -96 (160 - 256). Но как только нативный код видит значение, и интерпретирует его как беззнаковое байт, это будет фактически 160.

Смотрите этот вопрос для более подробной информации о приведении int к byte в Java: How are integers cast to bytes in Java?.

Теперь, если вам нужно больше 256 вершин, вам придется использовать тип индекса, поддерживающий больший диапазон. Это будет прекрасно работать, пока вы последовательны:

  • Использование short как тип указательного массива в Java, вы можете обратиться 65536 вершин. Аргумент типа сопоставления вызова glDrawElements() равен GL_UNSIGNED_SHORT.
  • Используя int как тип вашего индексного массива в Java, вы можете адресовать ... много вершин (2^32, что более 4 миллиардов). Аргументом типа сопоставления вызова glDrawElements() является GL_UNSIGNED_INT.