基本上分为两种情况
-
数据长度不一致
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);
网友评论