java opengl:glDraweElements()与>;32767个顶点
这一定很简单,但我错过了 我有一个复杂的模型,它有超过32767个顶点。现在,索引只能作为类型GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT传递给opengl。java没有unsigned的概念,因此unsigned short选项映射为simply(signed)short,即16位或+32767。指定顶点时,需要向opengl传递一个短[],其中数组中的值指向vertice数组中的顶点。但是,如果有>32767个顶点,则该值不适合短[] 是否有其他方法指定索引?下面是代码片段,谢谢java opengl:glDraweElements()与>;32767个顶点,java,android,opengl-es,unsigned,short,Java,Android,Opengl Es,Unsigned,Short,这一定很简单,但我错过了 我有一个复杂的模型,它有超过32767个顶点。现在,索引只能作为类型GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT传递给opengl。java没有unsigned的概念,因此unsigned short选项映射为simply(signed)short,即16位或+32767。指定顶点时,需要向opengl传递一个短[],其中数组中的值指向vertice数组中的顶点。但是,如果有>32767个顶点,则该值不适合短[] 是否有其他方法指定索引?下面是代
short[] shorts = ... read the indices ...;
...
ShortBuffer indicesBuffer = null;
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * Short.SIZE / 8);
ibb.order(ByteOrder.nativeOrder());
indicesBuffer = ibb.asShortBuffer();
indicesBuffer.put(indices);
indicesBuffer.position(0);
...
gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices, GL10.GL_UNSIGNED_SHORT, indicesBuffer);
...
我没有使用Java中的OpenGL,所以我在这里进行推测,但是很有可能您可以使用负数,其二进制表示形式与您真正想要的无符号正数相同。您将给GL一些字节对,并告诉它将它们解释为无符号,只要它们以这种方式解释时具有正确的值,就应该可以工作。当Java将这些位存储在内存中时,它是否认为它们意味着不同的东西并不重要 如果您正在迭代,只需忽略概括并继续递增即可。当你达到-1时,你就完成了
如果您将索引数计算为整数(不存在此范围问题),然后将其转换为短,则从大于32767的任何数字中减去65536。顺便说一句,这恰好是在使用opengl es 1.0的android平台上。我认为大多数手机无法以合理的性能处理这种复杂性。是的,我得出了同样的结论。对于一种高度重视类型安全的语言来说,你有点奇怪。我最初使用char,因为它本质上是一个无符号的短字符。我将指数计算为int,然后进行转换,以使其更简单并确保Hanks,最后我将它们视为int,并使用您上面提供的cveat将其转换为short,尽管我不知道转换操作是否会自动处理该问题。让您想知道创建java绑定的人是怎么想的。。。java在类型安全等方面非常强大。不要谈论OpenGL,而要谈论OpenGL ES:)。ES不支持索引的GL_UNSIGNED_INT,只支持GL_UNSIGNED_BYTE和GL_UNSIGNED_SHORT,这与Java无关。接下来,转换为INT时不需要减法。强制转换操作会处理它。e、 例如,int 32768转换为short is-32768。@farble1670:我一直认为Java中缺少无符号类型是一种设计缺陷。