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,所以数据实际长度为 \frac{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);
  
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容