版权声明:本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名elloop(包含链接)
作者是现在对相关知识理解还不是很深入,后续会不断完善。因此文中内容仅供参考,具体的知识点请以OpenGL的官方文档为准
前言
本文介绍了OpenGL ES 2.0 中的顶点缓冲对象(VBO: Vertex Buffer Object)和索引缓冲对象(IBO: Indice Buffer Object)的用法,
在之前的文章中图元的绘制没用使用VBO, 要绘制的顶点数据是以顶点数组的形式保存在客户端的内存中的,在每次调用glDrawArrays
或者glDrawElements
的时候,顶点数组都会被从客户端内存copy到显卡内存。
VBO的作用,就是把这份每次都要copy的顶点数组缓存在显卡的内存中,VBO使得我可以直接在显卡内存中分配并缓存顶点数据。这样就避免了每次调用draw的时候的copy操作,从而提高了渲染性能同时降低了内存带宽和设备的电量消耗。
IBO跟VBO的原理类似,只不过IBO是缓存了VBO绘制时候的Indices.
根据OpenGL ES 2.0 “Golden Book”的建议,要想获得最好的性能,就要尽可能使用VBO和IBO来完成绘制任务。
下面以一个具体的例子来展示如何使用VBO和IBO完成一个正方体的绘制。
效果图
图中这个绿色的正方体就是绘制的结果
实现
主要分三步:
-
准备好顶点数据,顶点索引数据;
-
创建VBO和IBO,分别和顶点数据、顶点索引数据绑定;
-
使用绑定后的VBO和IBO来完成绘制
1. 准备好顶点数据,顶点索引数据
正方体有八个顶点,定义如下:
绘制正方体主要是确定其八个顶点的坐标,如下图所示:
按编号从0~7以不同的颜色标识,下面定义出这8个顶点
2. 创建VBO和IBO,分别和顶点数据、顶点索引数据绑定
上面定义好了两个数组,接下来分别把顶点数组和索引数据绑定到VBO和IBO。
3. 使用绑定后的VBO和IBO来完成绘制
万事俱备,现在开始绘制:
完整的源代码和Shader
VboScene.h
VboScene.cpp
顶点shader: 3D_projection_vs.glsl
片段shader: 3D_projection_fs.glsl
源码下载
如果源码对您有帮助,请帮忙在github上给我点个Star, 感谢 :)
参考
本文侧重实战,api的使用细节请参考下面第二个链接,那里有各种OpenGL的API说明。
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问