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

Jef*_*man 4 java android unsigned opengl-es short

我有一个复杂的模型,它有 >32767 个顶点。现在,索引只能作为 GL_UNSIGNED_BYTE 或 GL_UNSIGNED_SHORT 类型传递给 opengl。java 没有 unsigned 的概念,因此 unsigned short 选项映射到简单的(有符号的)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);
    ...
Run Code Online (Sandbox Code Playgroud)

Wyz*_*a-- 5

我没有使用 Java 中的 OpenGL,所以我在这里推测,但是很有可能你可以只使用二进制表示与你真正想要的无符号正数相同的负数。你给了 GL 一些字节对,并告诉它把它们解释为无符号,只要它们以这种方式解释时具有正确的值,它就应该工作。当 Java 将这些位存储在内存中时,它是否认为它们意味着不同的东西并不重要。

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

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

  • 不要谈论 OpenGL,要谈论 OpenGL ES :)。ES 不支持 GL_UNSIGNED_INT 索引,只有 GL_UNSIGNED_BYTE 和 GL_UNSIGNED_SHORT,这与 Java 无关。 (2认同)