当前位置: 首页 > news >正文

成都 网站 建设/快速建站网站

成都 网站 建设,快速建站网站,齐齐哈尔网站建设,网站分辨率做多大简介 VBO是OpenGL提供的一种特性,主要是用于在非立即模式下(使用glBegin/glEnd这种方式)用来保存顶点数据(包括位置、纹理、颜色等),同时提供了更新这些数据的方法。 VBO相比较立即模式的渲染来说效率更高…

  • 简介

VBO是OpenGL提供的一种特性,主要是用于在非立即模式下(使用glBegin/glEnd这种方式)用来保存顶点数据(包括位置、纹理、颜色等),同时提供了更新这些数据的方法。 VBO相比较立即模式的渲染来说效率更高,这主要是因为VBO的数据一般会放在显存中而不是内存中。通俗点说VBO就好像是显卡中开辟的一块存储区域,用来把以前放在内存中的数据放在了显存中,便于更加方便的传输处理。  VBO特性是在OpenGL1.5版本引入的。

  •  VBO相关函数

OpenGL提供了几个对其进行操作的函数:

顶点缓冲区对象 API
glGenBuffers 创建顶点缓冲区对象
glBindBuffer顶点缓冲区对象设置为当前数组缓冲区对象(array buffer object)或当前元素(索引)缓冲区对象(element buffer object)
glBufferData顶点缓冲区对象申请内存空间,并进行初始化(视传入的参数而定)
glBufferSubData 初始化或更新顶点缓冲区对象
glDeleteBuffers 删除顶点缓冲区对象










  • 创建VBO

创建一个VBO需要3个步骤:

1. 新建一个新的缓冲区对象(调用 glGenBuffers)
2. 绑定缓冲区对象 (调用glBindBuffer)
3. 拷贝顶点数据到缓冲区对象中(调用glBufferData)

------------------------
glGenBuffer的函数原型如下:
void glGenBuffers  (GLsizei n, GLuint * buffers);
这个函数创建了新的缓冲区对象,并且返回这些对象的ID值,第一个参数是希望创建多少个缓冲区对象,第二个参数是传入接收这些对象ID的地址(如果是多个需要传入数组)

glBindBuffer的函数原型如下:
void glBindBuffer (GLenum target,GLuint buffer);
当我们创建好缓冲区对象之后,在使用之前需要先将该缓冲区对象设置为当前缓冲区对象(OpenGL是一个状态机,使用它的方式都是先切换在使用)。第一个参数是说明这个缓冲区是用来存储什么东西的。可以是存储顶点数组(GL_ARRAY_BUFFER) 或者是索引数组(GL_ELEMENT_ARRAY_BUFFER)。
这里需要注意: 所有顶点属性(如顶点坐标值、顶点纹理坐标、顶点法线和颜色)都必须使用GL_ARRAY_BUFFER。索引数组GL_ELEMENT_ARRAY_BUFFER是配合glDraw[Range]Elements()来使用的。
这个函数调用之后,VBO就被初始化完成。

glBufferData的函数原型如下:
void glBufferData(	GLenum  	target,GLsizeiptr  	size,const GLvoid *  	data,GLenum  	usage);
当缓冲区初始化完成之后,可以使用glBufferData往里面写入数据。
target:取值是GL_ARRAY_BUFFER或者是GL_ELEMENT_ARRAY,含义与上文中所述的一致。
size:需要写入的数据大小(以字节为单位)
data:写入数据的指针,如果data是空,那么VBO仅仅保留size大小的空间
usage:是一种优化的参数,根据实际使用情况来选定,可以有9种取值(仅仅是建议,其实可以随便选,但是按照使用的特点选取特定的模式可以获得更好的表现)
GL_STATIC_DRAW_ARB
GL_STATIC_READ_ARB
GL_STATIC_COPY_ARB
GL_DYNAMIC_DRAW_ARB
GL_DYNAMIC_READ_ARB
GL_DYNAMIC_COPY_ARB
GL_STREAM_DRAW_ARB
GL_STREAM_READ_ARB
GL_STREAM_COPY_ARB
”STATIC“开头的单词意味着VBO中的数据不会变化(一次赋值多次使用)。
”DYNAMIC“开头的单词意味着VBO中的数据会经常变化。
”STREAM“开头的单词意味着VBO中的数据每一帧都会变化
”DRAW“表示数据传输到GPU中进行绘制(从Application到GL)
”READ“表示数据是客户端程序来读取(从GL到Application)
”COPY“则表示数据的流向既有DRAW同时也有READ
需要注意的是:基本上VBO都只会用到DRAW,COPY和READ一般是在FBO和PBO(稍后介绍)中使用。

glBufferSubData函数原型如下:
void glBufferSubData(	GLenum  	target,GLintptr  	offset,GLsizeiptr  	size,const GLvoid *  data);

这个函数和glBufferData的作用有点类似,主要是向VBO中写入数据,但是它只是替换VBO中的一部分数据,另外在使用它之前的缓冲区对象必须先使用过glBufferData写入过全部的数据。(也就是说glBufferSubData不能更新一个全新的缓冲区对象[仅仅使用glBindBuffer,还未使用glBufferData写入的缓冲区])
参数含义与glBufferData基本类似,只不过它有一个offset偏移量,通过offset和size就能算出一个子区间,用来更新。

glDeleteBudffer函数原型如下:
void glDeleteBuffers(	GLsizei n,const GLuint * buffers);
函数很好理解,既然glGenBuffers控制生,那么glDeleteBuffer就是控制死了。参数含义与glGenBuffers一样。回收缓冲区对象。

  • 使用方式

上文已经介绍了所有相关的API,那么看看如何使用。下面就是一个使用简单的代码:
GLuint vboId;                              // 声明一个VBO的ID值
GLfloat* vertices = new GLfloat[vCount*3]; // 存放VBO数据的数组(内存中)// 新建缓冲区对象,并使用vboId来保存这个缓冲区的ID
glGenBuffers(1, &vboId);// 绑定缓冲区对象,作为数据数组使用
glBindBuffer(GL_ARRAY_BUFFER_ARB, vboId);// 写入内存中的数据到缓冲区对象中
glBufferData(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);// 当拷贝数据到缓冲区对象中之后,内存中的数组对象可以安全的被释放
delete [] vertices;// 程序结束后删除缓冲区对象(回收缓冲区以备之后使用)
glDeleteBuffers(1, &vboId);

  • 示例

关于VBO的示例可以参考《VA AVO VBO 备忘》一文,里面有详细的参数和使用介绍。

  • 更新VBO

VBO的一个特点是它可以在客户端被修改(相比显示列表)。最简单的更新VBO数据的方式是将新的数据通过glBufferData或者glBufferSubData拷贝到VBO中,这种情况下总是有关于顶点数据的两份拷贝,一份在应用程序中一份在VBO中。

OpenGL提供了另一种修改缓冲区对象的方式,将缓冲区对象映射到客户端内存中。客户端可以使用这个映射的指针来修改缓冲区中的数据,相关的API包括:
void * glMapBuffer(	GLenum target,GLenum access);
如果调用成功,会返回映射内存区的指针,失败返回NULL。
target参数的取值和glBindBuffer中target一样,access的取值包括以下几种
GL_READ_ONLY
GL_WRITE_ONLY
GL_READ_WRITE
另一个与之对应的API是
GLboolean glUnmapBuffer(	GLenum target);
当修改完VBO中的数据之后,必须调用Unmap函数解绑客户端的内存,如果成功返回GL_TRUE,失败返回GL_FALSE,如果返回GL_FALSE,说明VBO中的数据出现问题,需要重新发送数据。



参考文章:
1. Wiki:VBO
2.OpenGL Vertex Buffer Object

http://www.jmfq.cn/news/5157973.html

相关文章:

  • 如何做交友网站/惠州网络营销
  • dreamware做网站首页/百度网址提交入口
  • 用自建网站做外贸/seo网络推广培训
  • 香港服务器做营销网站/百度统计怎么使用
  • 网站开发 鲁山/谷歌浏览器官网下载手机版
  • 网站平台做推广/关键词分词工具
  • wordpress 循环菜单/合肥seo按天收费
  • 河源网页制作公司/优化大师电视版
  • 河北搜索引擎推广服务/seo网站管理招聘
  • 电商网站做导购/网络营销推广策略有哪些
  • 视觉中国网站建设公司/成都公司网站seo
  • 阿里云能放企业网站吗/北京网站优化怎么样
  • 网站建设解决方/深圳网络推广培训
  • 专业 旅游网站建设/百度推广网站
  • 东莞市传送机技术支持 网站建设/网站seo哪家做的好
  • 做折页的网站/优化网站关键词
  • dw不用代码做网站/全网营销推广服务
  • 网站创建公司网站/制作网页的流程
  • 烟台做网站/国际新闻最新消息战争
  • 惠州市企业网站seo营销工具/培训机构加盟店排行榜
  • 前端如何做双语网站/网站关键词优化方案
  • 网站建设包括什么/市场营销方案怎么写
  • 医疗美容网站建设方案/站长工具的网址
  • 智慧新零售系统/网络网站推广选择乐云seo
  • 男女做爰全过程网站/成都sem优化
  • 怎么做软文链接打开后是自定义网站/今日大新闻
  • 南昌制作企业网站/chatgpt入口
  • 铜陵网站开发/推广赚钱平台
  • 学校网站素材/博客网站
  • 江苏省中医院网站建设/手机上可以创建网站吗