OpenGL ES 2.0 VBO与渲染
1.VBO初始化
-
1) glGenBuffers()
- 生成bufferID 2) glBindBuffer()
- 操作它,参数为VBO的bufferID 3) glBufferData()
- 指定里面放的数据和用法
至此想用此VBO时再glBindBuffer()它的bufferID即可,里面一般放顶点数据(包括模型的xyz和纹理坐标uv),另外前提是已经编译和设定好了shader的program
2.使用VBO渲染
-
1) glEnableVertexAttribArray()
-
启用与顶点相关的shader的量
事先需要获取到它的handle,
比如
maPositionHandle = GLES20.glGetAttribLocation(mProgram, “aPosition”);
2) glBindBuffer()
- 操作想使用的VBO,参数为VBO的bufferID 3) glVertexAttribPointer ()
- 指定VBO里的数据的使用方法
-
这里有可能有多个glVertexAttribPointer (),它的最后一个参数是使用时每个元素的偏移量,比如顶点是xyzuv的float顶点,每个4*5个字节重复一次,则分开指定xyz坐标和纹理坐标时,最后一个参数的值分别取0和12
另外,最后不适用VBO时,最后一个参数可以直接指定要渲染的缓冲区
4) glDrawArrays()
- 指定画法(一般为GL_TRIANGLES,即三角形),数量等,即可使用VBO进行绘制 5) glDrawElements()
-
这是另一种画法,可以通过指定顶点索引的方式来画图形
使用这种方法渲染时,应该生成两块VBO buffer,一个用来存放顶点信息,另一个来存放索引信息,和普通顶点VBO区别是,存放顶点的VBO应该在使用和指定数据时使用GL_ELEMENT_ARRAY_BUFFER,再使用glDrawElements(). 例如
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBufferHandle[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,Count,buffer,GL_STATIC_DRAW);
glDrawElements(GL_TRIANGLES,count,GL_UNSIGNED_SHORT, 0);
-
参考
-
[OpenGL ES 06]使用VBO:顶点缓存
http://blog.csdn.net/kesalin/article/details/8351935
gles官方文档
https://www.khronos.org/opengles/sdk/docs/man/