3

私はopenGL ESの新機能で、単純なキューブを構築したいのですが、4つの異なるTRIANGLE_FANが必要なインデックスバイトバッファを許可するのに問題があるようです.これを行う/コードを書き直すにはどうすればよいですか:

public class GLCube{

private float vertices[] = {
    1, 1, -1, //p0 - topFrontRight
    1, -1, -1, //p1 bottomFront Right
    -1, -1, -1, //p2 bottom front left
    -1, 1, -1, //p3 front top left
    1, 1, 1, //p4 - topBackRight
    1, -1, 1, //p5 bottomBack Right
    -1, -1, 1, //p6 bottom back left
    -1, 1, 1, //p7 front back left
};

private FloatBuffer vertBuff;

private short[] pIndex = { 
        0, 4, 1, 3, //i0 fan of top front right
        5, 4, 1, 6, //i1 fan from bottom right back
        2, 1, 3, 6, //i2 fan from bottom left front
        7, 3, 4, 6 //i3 fan from top left back
};

private ShortBuffer pBuff;

public GLCube(){

    ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4);
    bBuff.order(ByteOrder.nativeOrder());
    vertBuff = bBuff.asFloatBuffer();
    vertBuff.put(vertices);
    vertBuff.position(0);


    ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2);
    pbBuff.order(ByteOrder.nativeOrder());
    pBuff = pbBuff.asShortBuffer();
    pBuff.put(pIndex);
    pBuff.position(0);
}

public void draw(GL10 gl){
    gl.glFrontFace(GL10.GL_CW);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

}
}

GL10.GL_PRIMITIVE_RESTARTを使用する必要があると思いますが、Androidでは、これが存在するとは思いません...

4

1 に答える 1

3

あなたはあなたの仮定で正しいです、primitive_restart拡張なしであなたはへの1回の呼び出しで複数の三角形のファンをレンダリングすることはできませんglDrawElements。できることはglMultiDrawElements、1回の呼び出しで複数のプリミティブを描画できるuseですが、その使用は少し面倒であり、単一の三角形リストよりもパフォーマンス上の利点があるかどうかはわかりません(特にこの単純な立方体の場合) 。

私があなたに与える一般的なヒントは、三角ストリップやファンのような複雑なプリミティブから離れることです。なぜなら、それらはいくつかの特別な小さなジオメトリ(とにかくパフォーマンス上の利点が得られないもの)にのみ使用されるからです。より大きな一般的なメッシュは、もしあれば、それらのプリミティブ型から実際に利点を得るには、はるかに多くの労力を必要とします。単純なインデックス付きの三角形リストを使用するだけで問題ありません。

ちなみに、キューブの「洗練された」テッセレーションが本当に必要な場合は、単一の三角ストリップからキューブを作成できますが、これに対する解決策はあなたかグーグル次第です。

編集: GLES仕様を調べたところ、glMultiDraw...ESで機能が削除されたようです。したがって、少なくとも1回の呼び出しで立方体を描画する場合は、単一のインデックス付き三角形リスト(または三角ストリップソリューション)を回避する方法はありません。これをお勧めします。

于 2011-08-09T12:41:57.553 に答える