java opengl:glDrawElements(),带有> 32767个顶点

时间:2010-12-02 02:08:14

标签: java android opengl-es unsigned short

这一定很简单,但我很想念它。

我的复杂模型有> 32767个顶点。现在,索引只能作为类型GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT传递给opengl。 java没有unsigned的概念,因此unsigned short选项映射到简单(signed)short,即16位或+32767。当我指定顶点时,我需要向opengl传递一个short [],其中数组中的值指向顶点数组中的顶点。但是,如果有> 32767个顶点,则该值将不适合short []。

还有另一种指定索引的方法吗?代码片段如下,谢谢。

    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);
    ...

1 个答案:

答案 0 :(得分:4)

我没有使用过Java的OpenGL,所以我在这里推测,但你很有可能只使用负数,其二进制表示与你真正想要的无符号正数相同。您给GL一些字节对并告诉它将它们解释为无符号,并且只要它们在解释时具有正确的值,它就应该有效。如果Java认为它们在存储器中存储这些位时意味着不同的东西并不重要。

如果你正在迭代,只需忽略环绕并继续递增。当你到达-1时,你已经完成了。

如果您将索引编号计算为整数(没有此范围问题)然后强制转换为空,则从任何大于32767的数字中减去65536。