LWJGL 拉丝大网

LWJGL drawing large 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)。

嗯,一个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.