启用属性时的SIGSEGV

时间:2013-05-19 13:47:42

标签: java android opengl-es opengl-es-2.0

我正在尝试在Android应用中呈现一个对象。几何图形基于交错的顶点缓冲区(位置数据和普通数据)和索引缓冲区。

顶点着色器需要这两个属性:

VertexShader:

...
attribute vec3 vPosition;
attribute vec3 vNormal;
...

在Java方面:

//after compiling the shader
positionHandle = GLES20.glGetAttribLocation(effect, "vPosition");
normalHandle = GLES20.glGetAttribLocation(effect, "vNormal");
然后我用:

绘制几何体
GLES20.glUseProgram(effect);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glEnableVertexAttribArray(normalHandle);

final int stride = 24;
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, stride, 0);
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, false, stride, 12);

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, 
    GLES20.GL_UNSIGNED_SHORT, indexBuffer);

然而,这会导致

  

A / libc(1010):致命信号11(SIGSEGV)位于0x00000002(代码= 1),线程1024(线程-81)

如果我删除了对glEnableVertexAttribArray(normalHandle)的调用,则会成功呈现(尽管由于缺少法线而呈黑色)。 normalHandle变量的值为1。

我已经在模拟器上测试了它,因为我现在没有物理设备。

以上代码有问题吗?或者这个错误是由模拟器引起的,应用程序应该在物理设备上运行吗?

1 个答案:

答案 0 :(得分:1)

复制自我之前的评论:

该行

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, GLES20.GL_UNSIGNED_SHORT, indexBuffer);

对我来说有点可疑,因为最后一个参数应该是当前绑定的ELEMENT_ARRAY_BUFFER的字节偏移量,但是你的变量名称建议你传递一个缓冲区句柄。如果是这样,这可能会产生任何奇怪的影响。