LWJGL绘制大网格

时间:2015-01-22 00:21:18

标签: java opengl byte lwjgl mesh

我正在考虑将.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)。

1 个答案:

答案 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个顶点,则必须使用支持更大范围的索引类型。只要你保持一致,那就可以正常工作:

  • 在Java中使用short作为索引数组的类型,可以处理65,536个顶点。 glDrawElements()来电的匹配类型参数为GL_UNSIGNED_SHORT
  • 使用int作为Java中索引数组的类型,可以解决很多顶点(2 ^ 32,超过40亿)。 glDrawElements()来电的匹配类型参数为GL_UNSIGNED_INT