Android OpenGL Point Clouds - PullRequest
       14

Android OpenGL Point Clouds

3 голосов
/ 16 июня 2011

Я пытался использовать

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

Спасибо!

1 Ответ

5 голосов
/ 16 июня 2011

Вы совершенно неправильно используете 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 интерпретирует предоставленный vertexBuffer как массив из 4 байтов, и эти байты ссылаются на вершины вне диапазона ваших данных вершин (от 0 до 3). ).

...