Java 启用属性时的SIGSEGV

Java 启用属性时的SIGSEGV,java,android,opengl-es,opengl-es-2.0,Java,Android,Opengl Es,Opengl Es 2.0,我正在尝试在android应用程序中渲染对象。几何体基于交错顶点缓冲区(位置数据和法线数据)和索引缓冲区 顶点着色器需要这两个属性: 顶点着色器: ... attribute vec3 vPosition; attribute vec3 vNormal; ... 在Java方面: //after compiling the shader positionHandle = GLES20.glGetAttribLocation(effect, "vPosition"); normalHandle

我正在尝试在android应用程序中渲染对象。几何体基于交错顶点缓冲区(位置数据和法线数据)和索引缓冲区

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

顶点着色器:

...
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):0x00000002(代码=1)处的致命信号11(SIGSEGV),线程1024(线程-81)

如果我删除对
GlenableVertexAttributeArray(normalHandle)
的调用,它将成功渲染(尽管由于缺少法线而呈现黑色)。
normalHandle
变量的值为1

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


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

复制自我之前的评论:

线路

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

看起来有点可疑,因为最后一个参数应该是当前绑定的
元素\u数组\u缓冲区的字节偏移量
,但您的变量名表明您正在传递缓冲区句柄。如果是这样,这可能会产生任何奇怪的效果。

调用
GLES20.glpaurements(GLES20.GL_三角形,indexCount,GLES20.GL_UNSIGNED_SHORT,indexBuffer)
看起来有点可疑,因为最后一个参数应该是当前绑定的
元素\u数组\u缓冲区的字节偏移量
,但您的变量名表明您正在传递缓冲区句柄。如果是这样的话,这可能会产生任何奇怪的效果。@derhass:哦,这是上一个版本的遗留版本,当时它的类型是
Buffer
(它似乎也不起作用)。改变它可以解决问题。你能补充一下吗?