位置: 编程技术 - 正文

OpenGL 顶点缓存对象(opengl update)

编辑:rootadmin

推荐整理分享OpenGL 顶点缓存对象(opengl update),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl缓冲区,opengl update,opengl缓冲区,opengl顶点缓冲区 顶点数组对象,opengl读取帧缓冲区,opengl顶点缓冲区 顶点数组对象,opengl帧缓存,opengl缓冲区,内容如对您有帮助,希望把文章链接给更多的朋友!

顶点缓存对象(Vertex Buffer Object,简称 VBO),允许开发者根据情况把顶点数据放到显存中。

如果不用 VBO,用 glVertexPointer / glNormalPointer 来指定顶点数据,这时顶点数据是放在系统内存中的,每次渲染时,都要把数据从系统内存拷贝到显存,消耗不少时间。

实际上很多拷贝都是不必要的,比如静态对象的顶点数据是不变的,如果能把它们放到显存里面,那么每次渲染时都不需要拷贝操作,可以节约不少时间。

1. 检查扩展

GL_ARB_vertex_buffer_object,是一个 OpenGL 的扩展,也就是 VBO。

为了使用此扩展,首先要检测当前的 OpenGL 版本是否支持此扩展。写一个函数如下,可用于检查任意扩展,参数是扩展名的字符串。

然后,调用 CheckExtension 检测扩展是否存在,扩展名为 GL_ARB_vertex_buffer_object。如果扩展存在,再调用 wglGetProcAddress 分别获取所需的扩展函数的指针。例如: glGenBuffers、 glBindBuffer。

有时候,也会使用 glGenBuffersARB 这样的名称,以表示此函数是扩展库中的。在旧版本的 OpenGL 中常见到,新版本的 OpenGL 使用 glGenBuffers 这样去掉 ARB 的即可。

2. 创建顶点缓存对象

建立 VBO 需要三个步骤:

创建缓存对象,使用 glGenBuffers()绑定缓存对象(指定使用哪一个缓存对象),使用 glBindBuffer()拷贝顶点数据到缓存对象中,使用 glBufferData()

三个函数的简介如下。

void glGenBuffers(GLsizei n, GLuint* ids)

创建缓存对象,并返回缓存对象的标识符。

n - 创建缓存对象的数量。ids - 是一个 GLuint 型的变量或数组,用于储存缓存对象的单个 ID 或多个 ID。

void glBindBuffer(GLenum target, GLuint id)

一旦创建了缓存对象后,我们需要绑定缓存对象,以便使用。绑定,也就是指定当前要使用哪一个缓存对象。

target - 缓存对象要存储的数据类型,只有两个值: GL_ARRAY_BUFFER, 和 GL_ELEMENT_ARRAY_BUFFER。如果是顶点的相关属性,例如: 顶点坐标、纹理坐标、法线向量、颜色数组等,要使用 GL_ARRAY_BUFFER;索引数组,要使用 GL_ELEMENT_ARRAY_BUFFER,以便 glDrawElements() 使用。

id - 缓存对象的 ID。

void glBufferData(GLenum target, GLsizei size, const void* data, GLenum usage)

拷贝数据到缓存对象。

target - 缓存对象的类型,只有两个值: GL_ARRAY_BUFFER 和 GL_ELEMENT_ARRAY_BUFFER。size - 数组 data 的大小,单位是字节(bytes)。data - 数组 data 的指针,如果指定为 NULL,则 VBO 只创建一个相应大小的缓存对象。usage - 缓存对象如何被使用,有三中: 静态的(static)、动态的(dynamic)和流(stream)。共有 9 个值:

老版本的 OpenGL 会加 ARB,变成形如 GL_STATIC_DRAW_ARB 的形式。

Static 指在缓存对象中的数据不能够更改(设定一次,使用很多次)。Dynamic 指数据将会频繁地更改(反复设定和使用)。Stream 指的是每一帧数据都会更改(设定一次,使用一次)。Draw 指数据将会被送到 GPU 被用于绘制(application to GL)。Read 指数据将被读取到客户端应用程序(GL to application)。Copy 指数据将被用于绘制和读取(GL to GL)。

要注意,Draw 只对 VBO 有用; Copy 和 Read 只对 PBO(像素缓存对象) 和 FBO(帧缓存对象) 有意义。

VBO 内存管理器会根据标记选取适当的存储位置。

OpenGL 顶点缓存对象(opengl update)

void glBufferSubData(GLenum target, GLint offset, GLsizei size, void* data)

与 glBufferData() 一样,都是用于拷贝数据到缓存对象的。它能拷贝一段数据到一个已经存在的缓存,偏移量为 offset。

void glDeleteBuffers(GLsizei n, const GLuint* ids)

删除一个或多个缓存对象。

3. 顶点缓存和索引缓存的使用

有数据如下:

生成缓存对象,并拷贝数据。

然后,在使用的时候,加入如下代码。

使用缓存对象的方法有三种:

4. 将不同类型的数据拷贝到一个缓存对象

用 glBufferSubData() 可以将几个数据拷贝到一个缓存对象中。例如,有以下数据:

现在,要将两个数组存在同一个缓存对象中,顶点数组在前,颜色数组在后。代码如下:

创建好缓存对象后,要用 glVertexPointer 和 glColorPointer 指定相应的指针位置。但是,由于 glColorPointer 的最后一个参数,必须是指针类型。请看下面的代码,glColorPointer 的最后一个参数用偏移量指示了颜色数组的位置。

5. 修改缓存对象

比起显示列表,VBO 一个很大的优点是能够读取和修改缓存对象的数据。最简单的方法是重新拷贝虽有数据到 VBO,利用 glBufferData() 和 glBufferSubData(),这种情况下,你的程序必须要保存有两份数据:一份在客户端(CPU),一份在设备端(GPU)。

另一种方法,是将缓存对象映射到客户端,再通过指针修改数据。

void* glMapBuffer(GLenum target, GLenum access)

映射当前绑定的缓存对象到客户端,glMapBuffer 返回一个指针,指向缓存对象。如果 OpenGL 不支持,则返回 NULL。

target - GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY_BUFFER。access - 的值有三个 GL_READ_ONLY、 GL_WRITE_ONLY、 GL_READ_WRITE,分别表示只读、只写、可读可写。

如果 OpenGL 正在操作缓存对象,此函数不会成功,直到 OpenGL 处理完毕为止。为了避免等待,可以先用 glBindBuffer(GL_ARRAY_BUFFER, 0) 停止缓存对象的应用,再调用 glMapBuffer。

GLboolean glUnmapBuffer(GLenum target)

修改完数据后,将数据反映射到设备端。

使用方法见如下代码。

参考资料

[1] 关于GL_ARB_vertex_buffer_object扩展

[2] OpenGL Vertex Buffer Object (VBO)

OpenGL顶点数组 OpenGL中,如果要绘制图元,一般来说会使用:glBegin(GL_LINES);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(1.0f,0.0f,0.0f);glEnd();但是,如果顶点数太多,这种方法需要频繁调

Ubuntu. GLUT的安装 更新源第一步更新源,最好换成国内的一些源,开始因为一些原因,始终安装不成功,换了源以后问题一下就解决了。换源教程,来自百度经验.我用的

OpenGL导入三维模型 最近一直没有写2dx的文章,一篇文章写到一半就扔草稿箱了,虽然卡牌游戏已经可以在手机上玩耍,但是暂时还没有情绪去分析它。。这周为了游戏课

标签: opengl update

本文链接地址:https://www.jiuchutong.com/biancheng/369422.html 转载请保留说明!

上一篇:ios平台中glsl中shadow2DProjEXT函数的简单说明以及变换矩阵的小注意点

下一篇:OpenGL顶点数组(opengl 顶点)

  • 发放福利视同销售进项税要转出吗?
  • 税务局开专票作废重开流程
  • 怎么计提固定资产折旧科目
  • 主办会计跟会计有什么区别
  • 个税申报人员报送成功怎么删除
  • 盘盈固定资产明细账怎么填写?
  • 为什么差额征税有的可以开专票有的只能开普票
  • 已导出的申报表如何修改
  • 外包工加工工资怎么结算
  • 境内公司取得境外收入
  • 免税的开成有税率的怎么办
  • 固定资产租入租金计入什么科目
  • 企业所得税中管理费用怎么填列
  • 应付账款收不回,可否转营业外收入
  • 进口增值税的账务处理
  • 销售产生的磅差入什么科目?
  • 银行给企业的存款怎么存
  • 油品沥青消费税征收范围
  • 财会〔2017〕22号:《企业会计准则第14号收入》的通知
  • 季度弥补以前年度亏损报表怎么填
  • 应付政府补贴款名词解释
  • 如何查看本月还款金额
  • 公共基础设施折旧年限表 20
  • 小规模纳税人金融服务税率
  • 研发费用申报表汇算清缴怎么填
  • 航信税控系统如何开销货清单
  • 跨月的红字发票
  • 最新版小企业会计准则是哪一年的
  • 软件开发行业的现状
  • 留置权什么时候才可以行使
  • 累计计税折旧如何调整
  • 如何查询税务完税证明
  • 律师费怎样入账
  • 应收票据其他应收款都需要提取坏账准备么
  • php管理员权限控制
  • html制作动画代码
  • 阿里什么
  • vue组件入门
  • 深度学习之快速实现数据集增强的方法
  • 2023年我要实现的目标是
  • php公众号推送完整示例
  • python中字符串的长度怎么算
  • 员工加班打车费报销
  • 含税与不含税的计算公式
  • 预付卡业务开票怎么开
  • 破产的产业要退回资金吗?
  • 政府补助会计处理方法由总额法变为净额法
  • 税务稽查补缴上年所得税分录
  • 小微企业社保代缴
  • 产品因质量问题换新质保期如何计算
  • 收到个人款怎么做分录
  • 滞纳金的收取依据
  • 工程施工和工程造价哪个好
  • 哪些资产减值损失确认过后是可以转回的
  • 外贸整个流程图
  • 记账凭证是什么填制的?A.由经办人
  • mysql 5.7.16 winx64安装配置方法图文教程
  • mysql5.7安装教程详细
  • mysql从一张表复制数据到另一张表
  • 微软系统无法开机怎么办
  • win8语言栏不见了 怎么调出来
  • linux中使用fdisk命令进行硬盘分区
  • win10系统如何关闭屏保功能
  • win7系统的wlan在哪里?
  • win8适合打游戏吗
  • linux的链接文件
  • host文件没有
  • win7系统咋样
  • Zen Coding css,html缩写替换大观 快速写出html,css
  • python rgb转cmyk
  • nodejs开发gui
  • python备份列表l
  • jquery插件使用教程
  • node.js中使用文件流进行文件复制,首先需要创建一个
  • 梦见擦窗户框
  • 湖北国税发票真伪查询
  • 国家税务总局发票查询官网
  • 企业投资项目备案表模板
  • 驻马店燃气投诉电话号码
  • 公共卫生委员会领导小组
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设