4

頂点数が 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);
    ...
4

1 に答える 1

5

私はJavaからOpenGLを使用していないので、ここで推測していますが、バイナリ表現が本当に必要な符号なしの正の数と同じである負の数を使用できる可能性は十分にあります。GLにいくつかのバイトペアを与え、それらを符号なしとして解釈するように指示しています.そのように解釈されたときに正しい値を持っている限り、それは機能するはずです. これらのビットをメモリに格納したときに、Java が別の意味であると判断したかどうかは問題ではありません。

繰り返している場合は、ラップアラウンドを無視してインクリメントを続けてください。-1 になったら完了です。

インデックス番号を int として計算し (この範囲の問題はありません)、short にキャストする場合は、32767 より大きい数値から 65536 を引きます。

于 2010-12-02T02:25:14.600 に答える