OpenGL顶点缓冲区对象
【OpenGL顶点缓冲区对象】
显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码。在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件。在最好的情况下,是编译后放在图形硬件中以减少传输的带宽。显示列表的优化根据实现的不同而有所不同,而且显示列表一旦被创建就不可以修改,灵活性差。
顶点数组提供了我们想要的灵活性,最坏的结果不过是把数据块复制给硬件而已(比立即模式快的多)。而索引顶点数组可以减少向硬件传输的顶点数据的数量,减少变换的开销。
OpenGL还提供了一个特性对图形的吞吐量进行终极的控制。当我们使用顶点数组时,可以把单个数组从客户内存(CPU可以访问)传输到图形硬件。这个特性称为顶点缓冲区对象,允许我们按照类似于管理纹理的方式来管理顶点数组数据,而且顶点缓冲区对象要更灵活。
管理和使用缓冲区对象
首先要使用缓冲区对象得有顶点数组。第二步创建顶点缓冲区对象,使用函数:
void glGenBuffers(GLsizei n, GLuint *buffers);
这个函数工作方式像glGenTextures一样。其对应的删除缓冲区对象的函数是glDeleteBuffers。
然后绑定顶点缓冲区对象:
void glBindBuffer(GLenum target, GLuint buffer);
这里的target参数指定了要绑定什么样的数组。类型有很多,可以是顶点数组GL_ARRAY_BUFFER,顶点索引数组GL_ELEMENT_ARRAY_BUFFER(用于glDrawElements和其他基于索引的渲染函数)等。
加载缓冲区对象
在绑定了缓冲区对象之后,我们就可以往图形硬件拷贝顶点数组了。
void glBufferData(GLenum target, GLsizeptr size, GLvoid *data, GLenum usage);
target可以是GL_ARRAY_BUFFER或者GL_ELEMENT_ARRAY_BUFFER等。size指定了顶点数组的大小(以字节为单位)。最后一个参数是用法提示。如下表:
用法提示 | 描述 |
GL_DYNAMIC_DRAW | 存储在缓冲区对象中的顶点数组经常要更新,并且可能多次作为绘图的来源。这个提示告诉OpenGL实现把数据放置在更新开销不大的地方。 |
GL_STATIC_DRAW | 数组很少更新,但可能多次作为绘图的来源。这个提示告诉OpenGL实现把数据放置在能够快速渲染但不需要快速更新的地方。 |
GL_STREAM_DRAW | 数据极少变化,并且最多只有几次作为绘图的源数据。这个提示告诉OpenGL实现有一些时间敏感的数据(例如动画)将只使用一次,然后被替换。 |
从顶点缓冲区对象渲染
从顶点缓冲区对象渲染有两个地方需要改动。首先,需要在调用glVertexPointer之前绑定缓冲区对象,然后把真实的数组指针改成顶点缓冲区对象的偏移值。例如:
glVertexPointer(3, GL_FLOAT, 0, pVerts);
现在变成了:
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[0]);
glVertexPointer(3, GL_FLOAT, 0, 0);
渲染 就变成了:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[3]);
glDrawElements(GL_TRIANGLES, nNumIdexes, GL_UNSIGNED_SHORT, 0);
最后一个参数会偏移量。从技术上说,缓冲区对象的这个偏移量基于本地体系结构的NULL指针。在大多数系统中,可设置为0.
参考:http://my.oschina.net/sweetdark/blog/186675
OpenGL顶点缓冲区对象的更多相关文章
- OpenGL顶点缓冲区对象(VBO)
转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO GL_ARB_vertex_buffer_object 扩展可 ...
- [译]OpenGL像素缓冲区对象
目录概述创建PBO映射PBO例子:Streaming Texture Uploads with PBO例子:Asynchronous Readback with PBO 概述 OpenGL ARB_p ...
- OpenGL 顶点缓存对象
顶点缓存对象(Vertex Buffer Object,简称 VBO),允许开发者根据情况把顶点数据放到显存中. 如果不用 VBO,用 glVertexPointer / glNormalPointe ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- OPenGL中的缓冲区对象
引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...
- OpenGL ES 3.0 帧缓冲区对象基础知识
最近在帧缓冲区对象这里卡了一下,不过前面已经了解了相关的OpenGL ES的知识,现在再去了解就感觉轻松多了.现在就进行总结. 基础知识 我们知道,在应用程序调用任何的OpenGL ES命令之前,需要 ...
- 3D Computer Grapihcs Using OpenGL - 19 Vertex Array Object(顶点数组对象)
大部分OpenGL教程都会在一开始就讲解VAO,但是该教程的作者认为这是很不合理的,因为要理解它的作用需要建立在我们此前学过的知识基础上.因此直到教程已经进行了一大半,作者才引入VAO这个概念.在我看 ...
- WebGL简易教程(三):绘制一个三角形(缓冲区对象)
目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...
- Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率
目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:第一步:将输入的数据复制一份到缓冲区,供OpenGL使用.而这块新出现的区域由VBO管理和表示.(若有多个输入 ...
随机推荐
- 激活函数之ReLU/softplus介绍及C++实现
softplus函数(softplus function):ζ(x)=ln(1+exp(x)). softplus函数可以用来产生正态分布的β和σ参数,因为它的范围是(0,∞).当处理包含sigmoi ...
- *android判断手机号的运营商
TextView tv=(TextView)findViewById(R.id.tv); TelephonyManager telManager = (TelephonyManager) getSys ...
- ROS机器人星火计划公开课总结
非常荣幸参加了两次星火计划公开课(上海站), 感谢NXROBO.EXBOT以及所有支持ROS机器人星火计划的小伙伴们. ----废话开始,与课程总结无关,可跳过---- 在国内20多年的求学生涯以及2 ...
- 如何将u盘、移动硬盘转化为活动分区--绝招
https://jingyan.baidu.com/article/e75057f2a6a18aebc91a893e.html
- Dropping tests(二分加01数字)
个人心得:不能说题目太难,而是自己思维太菜,我开始以为这怎么都想不到的,但是学长说不是很简单吗,好吧我信了,我太low. 其实单纯二分只用于搜索,但是这种逆向答案二分确实比较难理解.给大神代码 [一些 ...
- 关于Gateway
为什么要有gateway?就是因为如果没有,很多的功能需要在在每个微服务中都实现,这样成本很高.
- 平均分割list
private static List<List<Integer>> splitList(List<Integer> lists,int limit){ int s ...
- js练习题笔记
javascrip测试题: 一.选择题(每题2分,多选题错选.少选不得分) 1.分析下段代码输出结果是( ) var arr = [2,3,4,5,6]; var sum =0; f ...
- Oracle记录(二) SQLPlus命令
对于Oracle数据库操作主要使用的是命令行方式,而所有的命令都使用sqlplus完成,对于sqlplus有两种形式.就我个人而言,还是比较喜欢UNIX与Linux下的Oracle.呵呵 一种是dos ...
- (转)使用PowerDesigner生成HTML功能
本文转载自:http://www.cnblogs.com/CowboyProgrammer/archive/2009/04/28/1445423.html 使用PowerDesigner设计数据库关系 ...