OpenGL ES 学习教程(五) 极速绘制,使用 VBO (顶点缓冲区对象)!
2015-12-04 00:05
513 查看
Notice:
工程中数组中的值未初始化,须修改如下
Texture2dApp()
{
for (int index = 0; index < 3; index++)
{
m_VboIds[index] = 0;
}
}
在渲染流水线中,如果我们要渲染一个模型文件,比如一个从 3dmax中导出的茶壶,要经历以下过程
( 图中虚线表示 仅一次 ,实线表示每帧一次 )
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
从硬盘读取模型数据,拷贝到内存中,然后每次绘制的时候上传到显卡。
平时玩游戏的时候,每过一个场景,都会打开一个 Loading 界面,在Loading 界面出现的时候,就是 从硬盘中读取 顶点数据到 设备内存中。
然后 当要渲染的时候,就直接从内存中 把顶点数据读取出来,然后上传到 显卡的显存中。这样节省了读取硬盘的时间。
但是在每一次绘制的时候,仍然需要把数据从内存中读取出来上传到显存,这是非常消耗性能的,而且这样的操作每一帧都需要执行!!
怎么能让这样糟糕的事情一直发生!!
让我们来干掉这一糟糕的流程,直接把顶点数据 缓存到 显卡显存!!
我们在显存中申请一块内存,作为缓冲区,来存放 顶点数据 。这块缓冲区就叫做:顶点缓冲区对象,即VBO 。
比如我这里修改第二篇的代码。转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
申请三个缓冲区,一个用来存放顶点位置,一个用来存放顶点颜色,一个用来存放顶点索引。
申请缓冲区对象 并且绑定到对应的数据 的操作如下 [ Texture2dApp.h L68 ]:
GLuint m_VboIds[3];
glGenBuffers(3, m_VboIds);
//存放顶点位置数据
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(glm::vec3), pos, GL_STATIC_DRAW);
//存放顶点颜色数据
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[1]);
glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(glm::vec4), color, GL_STATIC_DRAW);
//存放顶点索引
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * sizeof(GLushort), indices, GL_STATIC_DRAW);
然后绘制的时候 [ Texture2dApp.h L87 ]
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glVertexAttribPointer(m_program.m_position, 3, GL_FLOAT, false, sizeof(glm::vec3), 0);
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[1]);
glVertexAttribPointer(m_program.m_color, 4, GL_FLOAT, false, sizeof(glm::vec4), 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[2]);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
然后结束绘制的时候要删除掉申请的缓冲区 [ Texture2dApp.h L111 ]
glDeleteBuffers(3, m_VboIds);
运行测试转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
示例工程下载: http://pan.baidu.com/s/1bXxeu
工程中数组中的值未初始化,须修改如下
Texture2dApp()
{
for (int index = 0; index < 3; index++)
{
m_VboIds[index] = 0;
}
}
在渲染流水线中,如果我们要渲染一个模型文件,比如一个从 3dmax中导出的茶壶,要经历以下过程
( 图中虚线表示 仅一次 ,实线表示每帧一次 )
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
从硬盘读取模型数据,拷贝到内存中,然后每次绘制的时候上传到显卡。
平时玩游戏的时候,每过一个场景,都会打开一个 Loading 界面,在Loading 界面出现的时候,就是 从硬盘中读取 顶点数据到 设备内存中。
然后 当要渲染的时候,就直接从内存中 把顶点数据读取出来,然后上传到 显卡的显存中。这样节省了读取硬盘的时间。
但是在每一次绘制的时候,仍然需要把数据从内存中读取出来上传到显存,这是非常消耗性能的,而且这样的操作每一帧都需要执行!!
怎么能让这样糟糕的事情一直发生!!
让我们来干掉这一糟糕的流程,直接把顶点数据 缓存到 显卡显存!!
我们在显存中申请一块内存,作为缓冲区,来存放 顶点数据 。这块缓冲区就叫做:顶点缓冲区对象,即VBO 。
比如我这里修改第二篇的代码。转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
申请三个缓冲区,一个用来存放顶点位置,一个用来存放顶点颜色,一个用来存放顶点索引。
申请缓冲区对象 并且绑定到对应的数据 的操作如下 [ Texture2dApp.h L68 ]:
GLuint m_VboIds[3];
glGenBuffers(3, m_VboIds);
//存放顶点位置数据
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(glm::vec3), pos, GL_STATIC_DRAW);
//存放顶点颜色数据
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[1]);
glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(glm::vec4), color, GL_STATIC_DRAW);
//存放顶点索引
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * sizeof(GLushort), indices, GL_STATIC_DRAW);
然后绘制的时候 [ Texture2dApp.h L87 ]
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glVertexAttribPointer(m_program.m_position, 3, GL_FLOAT, false, sizeof(glm::vec3), 0);
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[1]);
glVertexAttribPointer(m_program.m_color, 4, GL_FLOAT, false, sizeof(glm::vec4), 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[2]);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
然后结束绘制的时候要删除掉申请的缓冲区 [ Texture2dApp.h L111 ]
glDeleteBuffers(3, m_VboIds);
运行测试转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
示例工程下载: http://pan.baidu.com/s/1bXxeu
相关文章推荐
- 导航条(Navbar)
- 防止已启动的VBScript文件重复启动
- 从VBA转到VSTO经历及感受
- Windows与VBox虚拟机共享目录的方法
- Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010
- vbs发送请求
- C#/VB.NET 向PowerPoint文档插入视频
- vbs函数大全
- VBS自学(四)
- C#/VB.NET 向PowerPoint文档插入视频
- vb脚本自动更新版本信息
- VB的计划任务的问题
- vbox共享文件 挂载
- vb.net 写入文件同步锁
- Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
- 硬链接与软连接[转自vbird]
- VB和C#中循环语句
- msvbvm50.exewin7修复版
- 磁盘与目录的容量[转自vbird]
- 另一个分区工具GNU的parted[转自vbird]