Android OpenGL ES 2. 0 VBO 不渲染
Posted
技术标签:
【中文标题】Android OpenGL ES 2. 0 VBO 不渲染【英文标题】:Android OpenGL ES 2. 0 VBO Not Rendering 【发布时间】:2016-05-15 13:33:16 【问题描述】:我正在尝试获取一个简单的带纹理的四边形来渲染为 VBO。当不使用 VBO 时,一切都按预期工作(但是,对于静态对象,我仍然在每帧更新我的顶点数据,这似乎毫无意义,因此切换到 VBO)。
但是,我一定做错了什么,因为我什么也没得到,绝对是 zilch,渲染到屏幕上。
这是我的相关代码:
构造函数:
public VBO()
updateVertexData();
vertexBuf = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuf.put(vertices);
vertexBuf.position(0);
//Create buffers array for VBO (I'm using interleaved data so only 1 needed here??
final int buffers[] = new int[1];
GLES20.glGenBuffers(1, buffers, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuf.capacity() * 4, vertexBuf, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
mBufferIdx = buffers[0];
vertexBuf.limit(0);
vertexBuf = null;
顶点更新
public void updateVertexData()
vertices[0]=-1;
vertices[1]=1f;
vertices[2]=0;
vertices[3]=0;
vertices[4]=0;
vertices[5]=1;
vertices[6]=1f;
vertices[7]=0;
vertices[8]=1;
vertices[9]=0;
vertices[10]=-1;
vertices[11]=-1f;
vertices[12]=0;
vertices[13]=0;
vertices[14]=1;
vertices[15]=1;
vertices[16]=-1f;
vertices[17]=0;
vertices[18]=1;
vertices[19]=1;
渲染
public void drawVBO()
GLES20.glUseProgram(iProgId);
mMVPMatrixHandle = GLES20.glGetUniformLocation(iProgId, "uMVPMatrix");
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);
GLES20.glEnableVertexAttribArray(iPosition);
GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 5 * 4, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);
GLES20.glEnableVertexAttribArray(iTexCoords);
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
就像我说的,如果我去掉 VBO 代码并将代码从 updateVertexData 移回我的 draw 方法,那么一切正常。如果有人能解释我在这里做错了什么,将不胜感激......
【问题讨论】:
嗨@RetoKoradi,感谢您的评论,我刚刚尝试过没有* 4,但没有任何区别,我仍然没有得到任何渲染。但是,不是 vertexBuf 是 FloatBuffer 而不是 ByteBuffer,因为我在末尾附加了一个“asFloatBuffer”?谢谢。 哦,好吧,我错过了这条线超出了可见区域,我不得不水平滚动。 没有问题@RetoKoradi,我想我已经弄清楚为什么它不起作用了:-) 【参考方案1】:问题出在第二个“glVertexAttribPointer”行上的偏移量。
原行
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);
“偏移”参数(末尾的“3”)错误。 3 是位置数据(x、y 和 z)的大小,需要乘以 4(每个浮点数的字节数)。所以...
正确代码
//For readability
final int POSITION_SIZE = 3;
final int BYTES_PER_FLOAT = 4;
final int TEXTURE_SIZE = 2;
final int STRIDE = (POSITION_SIZE+TEXTURE_SIZE)*BYTES_PER_FLOAT
//Correct line
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, STRIDE, (POSITION_SIZE*BYTES_PER_FLOAT));
【讨论】:
以上是关于Android OpenGL ES 2. 0 VBO 不渲染的主要内容,如果未能解决你的问题,请参考以下文章
Android OpenGL ES 2. 0 VBO 不渲染
使用OpenGL ES 2.0在Android上创建Audio wave