3

私は使用しようとしてきた

gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, vertexBuffer);

頂点バッファーを使用して画面に 4 つのポイントを描画する方法を教えてください。最終的には点群を表示したいので、描きたいのは点だけです。(最終的に) 多数のポイントがある場合、頂点バッファーを使用する方法はありますか? 変わるわけではありませんが、見る視点やスケールを変えていきたいです。

vertexBuffer セットアップ:

private float vertices[] = {
    -3.0f,  1.0f, -2.0f,  // 0, Top Left
    -3.0f, -1.0f, 0.0f,  // 1, Bottom Left
    -2.0f, -1.0f, -2.0f,  // 2, Bottom Right
    -2.0f,  1.0f, 0.0f,  // 3, Top Right
    };


// Our vertex buffer.
private FloatBuffer vertexBuffer;
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);

これは私のポイントの現在の描画呼び出しです (形状の描画順序は重要ではないため、インデックスは必要ありません)。

public void draw(GL10 gl) {
    // Enabled the vertices buffer for writing and to be used during 
    // rendering.
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glPointSize(3);

    // Specifies the location and data format of an array of vertex
    // coordinates to use when rendering.
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    gl.glDrawElements(GL10.GL_POINTS, 4, 
             GL10.GL_UNSIGNED_BYTE, vertexBuffer);

    // Disable the vertices buffer.
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    // Disable face culling.
    gl.glDisable(GL10.GL_CULL_FACE);
}

現在、draw(); を呼び出すとプログラムがクラッシュします。

ありがとうございました!

4

1 に答える 1

5

を完全に間違った使い方をしていますglDrawElements。この関数は、頂点データ自体ではなく、頂点配列へのインデックスを含むインデックス配列を必要とします (それglVertexPointerが目的です)。どちらかを使用

private unsigned byte indices[] = { 0, 1, 2, 3 };
...
gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, indices);

しかし、あなたの場合、すべてのポイントをレンダリングするだけで、インデックスは必要ないので、呼び出すだけです

gl.glDrawArrays(GL10.GL_POINTS, 0, 4);

の代わりにglDrawElements

編集:クラッシュする特定の理由はglDrawElements、提供された を 4 バイトの配列として解釈しvertexBuffer、これらのバイトが頂点データ (0 から 3) の範囲外の頂点を参照することです。

于 2011-06-16T17:13:41.897 に答える