Android OpenGL点云

Red*_*der 3 android opengl-es point-clouds

我一直在努力使用

gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, vertexBuffer);
Run Code Online (Sandbox Code Playgroud)

使用顶点缓冲区在我的屏幕上绘制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);
Run Code Online (Sandbox Code Playgroud)

这是我当前对我的点的绘制调用(我不想索引,因为形状绘制顺序对我来说无关紧要):

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);
}
Run Code Online (Sandbox Code Playgroud)

当我调用draw()时程序当前崩溃;

谢谢!

Chr*_*ica 5

你完全错误地使用了glDrawElements.这个函数想要一个包含索引的索引数组到顶点数组而不是顶点数据本身(这glVertexPointer就是用途).要么使用

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

但在你的情况下,你只需渲染所有点,不需要任何索引,所以你可以打电话

gl.glDrawArrays(GL10.GL_POINTS, 0, 4);
Run Code Online (Sandbox Code Playgroud)

而不是glDrawElements.

编辑:它崩溃的具体原因是glDrawElements将提供的解释vertexBuffer为4个字节的数组,这些字节引用顶点数据范围之外的顶点(0到3).