Android - 为什么我会收到致命的信号?

时间:2012-04-17 01:21:31

标签: android opengl-es

我试图用opengl es在屏幕上显示一些点。 这是ondraw的代码:

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glColor4f(0, 255, 0, 0);     
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buffer);
gl.glDrawArrays(GL10.GL_POINTS, 0, points.length);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

有人能告诉我我做错了什么吗?

编辑:生成缓冲区和点的代码

    points = new float[12288];
    int pos = 0;
    for (float y = 0; y < 64; y++) {
        for (float x = 0; x < 64; x++) {
            points[pos++] = x/100;
            points[pos++] = y/100;
            points[pos++] = 0;
        }
    }

    ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(points.length * 4);
    vertexByteBuffer.order(ByteOrder.nativeOrder());     
    // allocates the memory from the byte buffer
    buffer = vertexByteBuffer.asFloatBuffer();   
    // fill the vertexBuffer with the vertices
    buffer.put(points);  
    // set the cursor position to the beginning of the buffer
    buffer.position(0);

和logcat的错误:

04-17 06:38:11.296:A / libc(24276):致命信号11(SIGSEGV)位于0x41719000(代码= 2)

此错误发生在gl.glDrawArrays

2 个答案:

答案 0 :(得分:2)

我认为这是问题:

gl.glDrawArrays(GL10.GL_POINTS, 0, points.length);

glDrawArrays获取您要绘制的顶点的数量。你给它的是花车的数量,这个数字太大了3倍。因此,opengl实际上是在尝试读取12288个顶点= 36,xxx从你的点数组浮动,这超出了数组的范围。

答案 1 :(得分:-1)

问题:你没有调用glBindBuffer,但是你调用了glDrawArrays;这将导致段错误。

当我尝试使用IBO缓冲区而没有使用glBindBuffer命令首先绑定缓冲区时,我遇到了同样的问题。例如,我的一个绘制函数如下所示:

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, common.vbo);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, common.ibo);

GLES20.glVertexAttribPointer(handleManager.switchPosition, 2, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(handleManager.switchPosition);

GLES20.glDrawElements(GLES20.GL_TRIANGLES, common.iboPointCount, GLES20.GL_UNSIGNED_BYTE, 0);

GLES20.glDisableVertexAttribArray(handleManager.switchPosition);

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

所有glBindBuffer命令都可以对您尝试让着色器识别的属性数据进行操作。