GLES在Android上报错为SEGV_ACCERR

基本上分为两种情况

  • 数据长度不一致

    public float[] points=new float[100];
    FloatBuffer buffer=ByteBuffer.allocateDirect(4*100)
     .order(ByteOrder.nativeOrder())
     .asFloatBuffer();
     
    GLES20.glEnableVertexAttribArray(loc);
    floatBuffer.flip();
    GLES20.glVertexAttribPointer(loc, 3, GLES20.GL_FLOAT, false, 0, buffer);
    GLES20.glDrawArrays(...,0,100)
    

    由于点长度为3,所以数据实际长度为 ,但是glDrawArrays()给出的点却是100,所以会报错。

  • 多个着色器程序其中某个着色器程序中,顶点属性没有关闭,然后又紧接着使用下个程序写入新的数据会导致错误
//我们记着色器A为AShader, B为 Bshader, 它们各自有一个顶点属性 a,b 位置都为0
int aLoc=0;
int bLoc=0;
FloatBuffer buffer=ByteBuffer.allocateDirect(4*100)
    .order(ByteOrder.nativeOrder())
  .asFloatBuffer();

//Use aShader
GLES20.glEnableVertexAttribArray(aLoc);
//初始化数据省略
.....
//设置顶点数据 
buffer.position(0);
GLES20.glVertexAttribPointer(loc, 3, GLES20.GL_FLOAT, false, 0, buffer);
GLES20.glDrawArrays(...,0,100);
//假如我们将下面这句话注释掉 ,会导致不可预估的错误
//GLES20.glDisableVertexAttribArray(locPos); 

//Use bShader
GLES20.glEnableVertexAttribArray(bLoc);
//初始化数据省略
.....
//设置顶点数据 
buffer.position(0);
GLES20.glVertexAttribPointer(loc, 3, GLES20.GL_FLOAT, false, 0, buffer);
GLES20.glDrawArrays(...,0,100);
  

你可能感兴趣的:(GLES在Android上报错为SEGV_ACCERR)