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

时间: 2024-11-04 21:41:55

OpenGL顶点缓冲区对象的相关文章

OpenGL顶点缓冲区对象(VBO)

转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO        GL_ARB_vertex_buffer_object 扩展可以提升OpenGL的性能.它提供了顶点数组和显示列表,这避免了低效实现这些功能.Vertex buffer object (VBO) 允许顶点数据储存在高性能显卡上,即服务端的内存中,改善数据传输效率.如果缓冲区对象保存了像素数据,它就被称做Pixel Buffer Object (PBO). 使用

[译]OpenGL像素缓冲区对象

目录概述创建PBO映射PBO例子:Streaming Texture Uploads with PBO例子:Asynchronous Readback with PBO 概述 OpenGL ARB_pixel_buffer_object 扩展与ARB_vertex_buffer_object.很相似.为了把像素数据你储存在缓冲区对象中,而非顶点数据,它简单地扩展了 ARB_vertex_buffer_object extension.储存像素数据的缓冲区对象称为Pixel Buffer Obje

opengl学习笔记——缓冲区对象

1.创建缓冲区对象标示符 glGenBuffers(GLsizei n , GLuint * buffers), 生成n个当前未使用的缓冲区对象标示符(注意是标示符,不是缓冲区对象,缓冲区对象(即以下的target)包括GL_ARRAY_BUFFER(顶点数据),GL_ELEMENT_ARRAY_BUFFER(表示索引数据),GL_PIXEL_UNPACK_BUFFER(表示传递给Opengl的像素数据),GL_PIXEL_PACK_BUFFER(表示从opengl获取的像素数据),GL_COP

opengl学习笔记——顶点数组对象

1.创建顶点数组对象VAO void glGenVertexArrays(GLsizei n, GLuint * arrays); 返回n个当前未使用的名字,用作数组arrays中的顶点数组对象 GLvoid glBindVertexArray(GLuint array) 当使用的值array不是0并且是从glGenVertexArrays()返回的值时,创建一个新的顶点数组对象并且分配该名字.当绑定到之前创建的一个顶点数组对象的时候,该顶点数组对象变成活动的,这会影响到存储在该对象中的顶点数组

OpenGL像素缓冲对象(PBO)

免责申明(必读!):本翻译原稿来自以下链接,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! http://www.songho.ca/opengl/gl_pbo.html OpenGL的ARB_pixel_buffer_object 扩展非常接近ARB_vertex_buffer_object.它是为了将顶点数据(vertex data)和像素数据(Pixel data)存储在缓冲对象里面,简单的扩展了AR

顶点缓存对象(VBO)

创建VBO 绘制VBO 更新VBO 实例 GL_ARB_vertex_buffer_object扩展致力于提供顶点数组与显示列表的优势来提升OpenGL效率,同时避免它们实现上的不足.顶点缓存对象(VBO)准许顶点数组数据存放在服务端的高性能显卡内存中,且提供高效数据传输.如果缓存对象用于保存像素数据,就被称为像素缓存对象(PBO). 使用顶点数组可以降低函数调用次数与降低共享顶点的重复使用.然而,顶点数组的不足之处是顶点数组函数处在客户端状态中,且每次引用都须向服务端重新发送数据. 此外,显示

OpenGL顶点数组

概述 作为在立即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在一组列表中,包括顶点位置.法线.纹理坐标与颜色信息.并且你可以通过索引数组解引用数组元素绘制选定的几何图元. 看看下面的用立即模式绘制立方体的代码. glBegin(GL_TRIANGLES); // draw a cube with 12 triangles // 前面 ================= glVertex3fv(v0); // v0-v1-v2 glVertex3fv(

像素缓冲区对象PBO 记录

像素缓冲区对象PBO 记录 和所有的缓冲区对象一样,它们都存储在GPU内存中,我们可以访问和填充PBO,方法和其他的缓冲区一样. 当一个PBO被绑定到GL_PIXEL_PACK_BUFFER,任何读取像素的OpenGL操作都会从PBO中获取它们的数据,如glReadPixels,glGetTexImage和glGetCompressedTexImage.通常的操作会从FBO或纹理中抽取数据,并将它们读取客户端内存中.当PBO绑定到GL_PIXEL_PACK_BUFFER时,像素数据在GPU内存中

Opengl_On_Vs_2_顶点缓存对象

1,查看当前opengl版本 2,glewthe OpenGL Extension Wrangler Library. GLEW helps you deal with the headache that can accompany the management of extensions in OpenGL. Once initialized it queries for all the available extensions on your platform, dynamically lo