我正在考虑将.ply文件加载到vbo中,并在lwjgl + java中绘制它。文件正确加载并且所有数据都被正确解析,唯一的问题是它是一个具有大量索引(面)的模型。索引存储在byte []数组中。在java(可能是其他地方)中,字节最多只能达到128,但绘制网格所需的索引值超过128,所以我得到了这个错误。
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 []数组中一个字节的最大值,我已经尝试过基数,但是最小值是10(这让我得到128)。
答案 0 :(得分:1)
嗯,byte
是一个字节。它只能有256个不同的值。使用Java OpenGL绑定时,与索引范围有关。由于Java没有未签名的数据类型,因此支持的最大值可能看起来是127.但由于byte
值的数组将传递给本机代码,而本机代码将它们视为无符号值,因此最大数量为您可以使用byte
索引处理的顶点实际上是255。
例如,假设您将值{160}作为int
,并将其转换为byte
值,以便存储在byte[]
数组中。如果查看Java中的byte
值,它似乎已更改为-96(160 - 256)。但是,一旦本机代码看到该值,并将其解释为无符号字节,它实际上将为160。
有关在Java中int
转换为byte
的更多详细信息,请参阅此问题:How are integers cast to bytes in Java?。
现在,如果需要超过256个顶点,则必须使用支持更大范围的索引类型。只要你保持一致,那就可以正常工作:
short
作为索引数组的类型,可以处理65,536个顶点。 glDrawElements()
来电的匹配类型参数为GL_UNSIGNED_SHORT
。int
作为Java中索引数组的类型,可以解决很多顶点(2 ^ 32,超过40亿)。 glDrawElements()
来电的匹配类型参数为GL_UNSIGNED_INT
。