我正在尝试在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。
我已经在模拟器上测试了它,因为我现在没有物理设备。
以上代码有问题吗?或者这个错误是由模拟器引起的,应用程序应该在物理设备上运行吗?
答案 0 :(得分:1)
复制自我之前的评论:
该行
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, GLES20.GL_UNSIGNED_SHORT, indexBuffer);
对我来说有点可疑,因为最后一个参数应该是当前绑定的ELEMENT_ARRAY_BUFFER
的字节偏移量,但是你的变量名称建议你传递一个缓冲区句柄。如果是这样,这可能会产生任何奇怪的影响。