易码技术论坛

 找回密码
 加入易码
搜索
查看: 392211|回复: 1

[教程] [原创] Vertex Buffer Object 详解

[复制链接]
发表于 2006-10-15 00:49:21 | 显示全部楼层 |阅读模式
Vertex Buffer Object(以下简称VBO) 是OpenGL扩展中最重要的一块,也是必备的基础、实现其他扩展的前提。
VBO原理上相当于DirectX的VertexBuffer,作用就是将顶点数据保存到VRAM(或者AGP),实现高速绘图。
当然,两者在实现方法上有一定区别。另外,在实际应用中,VBO的效率要略低于VertexBuffer。

一、VBO扩展说明
[参见glext.h中的定义]

扩展函数原形:
  1. void glBindBufferARB(GLenum target, GLuint buffer);
  2. void glDeleteBuffersARB(GLsizei n, const GLuint *buffers);
  3. void glGenBuffersARB(GLsizei n, GLuint *buffers);
  4. boolean glIsBufferARB(GLuint buffer);
  5. void glBufferDataARB(GLenum target, GLsizeiptr size, const GLvoid *data,
  6.                 GLenum usage);
  7. void glBufferSubDataARB(GLenum target, GLintptr offset, GLsizeiptr size,
  8.                 const GLvoid *data);
  9. void glGetBufferSubDataARB(GLenum target, GLintptr offset,
  10.                 GLsizeiptr size, GLvoid *data);
  11. void *glMapBufferARB(GLenum target, GLenum access);
  12. boolean glUnmapBufferARB(GLenum target);
  13. void glGetBufferParameterivARB(GLenum target, GLenum pname, GLint *params);
  14. void glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params);
复制代码
扩展常数:
  1. target常数:
  2.    GL_ARRAY_BUFFER_ARB
  3.    GL_ELEMENT_ARRAY_BUFFER_ARB
  4. pname常数(用于GetBufferParameterivARB):
  5.    GL_BUFFER_SIZE_ARB
  6.    GL_BUFFER_USAGE_ARB
  7.    GL_BUFFER_ACCESS_ARB
  8.    GL_BUFFER_MAPPED_ARB
  9. pname常数(用于GetBufferPointervARB):
  10.    GL_BUFFER_MAP_POINTER_ARB
  11. usage常数:
  12.    GL_STREAM_DRAW_ARB
  13.    GL_STREAM_READ_ARB
  14.    GL_STREAM_COPY_ARB
  15.    GL_STATIC_DRAW_ARB
  16.    GL_STATIC_READ_ARB
  17.    GL_STATIC_COPY_ARB
  18.    GL_DYNAMIC_DRAW_ARB
  19.    GL_DYNAMIC_READ_ARB
  20.    GL_DYNAMIC_COPY_ARB
  21. access常数:
  22.    GL_READ_ONLY_ARB
  23.    GL_WRITE_ONLY_ARB
  24.    GL_READ_WRITE_ARB
复制代码

二、VBO的创建和销毁

VBO是通过绑定ID的方式来创建的,使用BindBufferARB函数:
   void BindBufferARB(enum target, uint buffer);

上述buffer ID可由用户直接指定,也可以通过GenBuffersARB函数获得,其作用是获得空闲的ID序列:
   void GenBuffersARB(sizei n, uint *buffers);

VBO创建之后,在程序结束时(或不再需要这个VBO时),需用DeleteBuffersARB将其销毁:
   void DeleteBuffersARB(sizei n, const uint *buffers);


三、VBO数据的初始化和修改

通过BindBufferARB创建并绑定VBO之后,需要使用BufferDataARB函数对VBO内的数据进行初始化:

void glBufferDataARB(GLenum target, GLsizeiptr size, const GLvoid *data,
                GLenum usage);

[详解] size为VBO缓冲区大小,data指向顶点数据的起始地址(用于初始化VBO数据。当data为NULL时,则不初始化顶点数据,仅划分相应的缓冲区空间),usage各常数效果如下:
    STREAM_DRAW_ARB:VBO只初始化一次,并且只能使用少数几次。
    STATIC_DRAW_ARB:VBO只初始化一次,并且可多次使用。
    DYNAMIC_DRAW_ARB:VBO可初始化多次,并且可多次使用。
    (DRAW/READ/COPY涉及到VBO数据存放的位置,将在后面再作详细讨论。)

[实例] VBO的创建、初始化和销毁
  1. GLuint nBufferID;
  2. //获得一个空闲的buffer ID:
  3. glGenBuffersARB(1, &nBufferID);
  4. //绑定buffer ID:
  5. glBindBufferARB(GL_ARRAY_BUFFER_ARB, nBufferID);
  6. //初始化VBO:
  7. glBufferDataARB(GL_ARRAY_BUFFER_ARB, 200, NULL, DYNAMIC_DRAW_ARB);
  8. ....
  9. //销毁VBO:
  10. glDeleteBuffersARB(1, &nBufferID);
复制代码

未完,待续。
原文:http://emsky.net/lendy/blog/article.asp?id=24
发表于 2009-3-14 04:19:22 | 显示全部楼层
原帖由 vsrq3439m 于 2009-3-14 01:38 发表
谢谢分享














QQ华夏外挂
剑侠世界外挂
传奇外传外挂
奇迹世界外挂
QQ三国外挂

隐形广告……
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-23 17:07 , Processed in 0.020400 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表