OpenGL下的VBO的图形绘制
来源:互联网 发布:怎样查笔记本mac地址 编辑:程序博客网 时间:2024/05/30 04:13
为了避免反复向显卡传送相同的定点数据,绘制大量顶点数据时OpenGL下可以使用缓存对象(Buffer Object)来将数据上传到显卡。
准备数据
我们的显示数据为一正方体,如下所示
顶点数据结构为颜色(RGBA)法线(xyz)坐标(xyz)
顶点数据存储在vertices, 定点的索引数据存储在indices, 同时还需要缓存对象的句柄vertexBuffer和indexBuffer
struct CUSTOM_VERTEX{float r, g, b, a;float nx, ny, nz;float x, y, z;};CUSTOM_VERTEX vertices[] = {{ 1.0f, 0.0f, 0.0f, 1.0f, -0.577f, 0.577f, 0.577f, -1.0f, 1.0f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, -0.577f, -0.577f, 0.577f, -1.0f, -1.0f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, 0.577f, 0.577f, 0.577f, 1.0f, 1.0f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, 0.577f, -0.577f, 0.577f, 1.0f, -1.0f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, 0.577f, 0.577f, -0.577f, 1.0f, 1.0f, -1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, 0.577f, -0.577f, -0.577f, 1.0f, -1.0f, -1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, -0.577f, 0.577f, -0.577f, -1.0f, 1.0f, -1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f, -0.577f, -0.577f, -0.577f, -1.0f, -1.0f, -1.0f },};GLuint indices[] = {0, 2, 3, 1,2, 4, 5, 3,4, 6, 7, 5,6, 0, 1, 7,6, 4, 2, 0,1, 3, 5, 7,};int num_indices = sizeof(indices) / sizeof(indices[0]);int num_vertices = sizeof(vertices) / sizeof(vertices[0]);GLuint vertexBuffer;GLuint indexBuffer;初始化
glGenBuffers创建缓冲对象,句柄(创建对象的标示符)存储在vertexBuffer,本例中创建对象数量为1
glBindBuffer激活缓冲区,指定当前缓冲对象,从而使接下的操作都是对该对象进行的。GL_ARRAY_BUFFER表示顶点数据,GL_ELEMENT_ARRAY_BUFFER表示索引数据。
该函数有三个功能:
1.buffer(非0)为首次使用,创建新缓冲对象
2.buffer为已创建对象则激活该对象
3.buffer为0则停止使用该对象
glBufferData为缓存对象分配数据空间,然后将数据从内存复制到缓冲对象,GL_STATIC_DRAW表示数据只复制一次,可多次用来绘图。
// 顶点缓存glGenBuffers(1, &vertexBuffer);glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);glBufferData(GL_ARRAY_BUFFER, num_vertices * sizeof(CUSTOM_VERTEX), vertices, GL_STATIC_DRAW);// 索引缓存glGenBuffers(1, &indexBuffer);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);glBufferData(GL_ELEMENT_ARRAY_BUFFER, num_indices * 4, indices, GL_STATIC_DRAW);// 解除绑定glBindBuffer(GL_ARRAY_BUFFER, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
使用缓存对象
// 激活缓存对象 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); // 指定数组格式 glInterleavedArrays(GL_C4F_N3F_V3F, 0, NULL); // 开始绘制 glDrawElements(GL_QUADS, num_indices, GL_UNSIGNED_INT, NULL); // 绘制完成,解除绑定 // 转载请注明http://blog.csdn.net/boksic // 如有疑问欢迎留言 glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
效果如下
缓存数据的更新
接下来时这更新顶点数据,可以使用glMapBuffer来获取(该方法适合大量更新的情况,部分更新时应使用glBufferSubData等其他函数)
本例中更新所有顶点的坐标让其随时间作正弦运动
t += 0.0001;GLfloat* data;data = (GLfloat*)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);if (data != (GLfloat*)NULL){for (int i = 0; i < num_vertices; i++){data[10 * i + 8] += 0.001*cos(t);}glUnmapBuffer(GL_ARRAY_BUFFER);}
结果:
0 0
- OpenGL下的VBO的图形绘制
- [OpenGL]用OpenGL图形的绘制--矩形
- OpenGL基本图形绘制方式比较(glBegin,glCallList,glVertexPointer,VBO)
- OpenGL绘制基本图形单元的方法
- ODE调用OpenGL绘制图形的正反面
- 使用VAO VBO绘制图形
- OpenGL(二)图形绘制之平面多面体的绘制
- OpenGL(二)图形绘制之多边形面的绘制
- [OpenGL]利用OpenGL绘制一些简单的图形
- OpenGL学习脚印: 基本图形绘制方式比较(glBegin,glCallList,glVertexPointer,VBO)
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- opengl中VBO的使用演示
- OpenGL中的VBO与VAO的使用
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- 索引顶点的VBO与多重纹理下的VBO
- 项目绩效报告
- heapsort堆排序
- priority queue 优先队列
- SQLCookbook 学习笔记 2结果排序
- linux创建静态库和动态库
- OpenGL下的VBO的图形绘制
- Ubuntu 14.04 LTS下安装Google Chrome浏览器
- leetcode Maximum Subarray
- android自定义EditText
- [BZOJ 2007][NOI 2010]海拔(平面图最小割)
- 重复造轮子-Win7添加右键adbinstall
- STM32初探-点亮第一个led灯
- 【转】使用 Struts 2 开发 RESTful 服务
- 【Uni2D】AtlasEntry