美文网首页
GLES在Android上报错为SEGV_ACCERR

GLES在Android上报错为SEGV_ACCERR

作者: 我爱麦芽糖 | 来源:发表于2019-07-12 17:28 被阅读0次

    基本上分为两种情况

    • 数据长度不一致

      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);
      
    

    相关文章

      网友评论

          本文标题:GLES在Android上报错为SEGV_ACCERR

          本文链接:https://www.haomeiwen.com/subject/kwpykctx.html