opengl学习-高级数据

2023-11-11

glBufferData函数

填充整个缓冲对象,会分配一块内存,并将数据添加到这块内存中。如果dataNULL则只分配内存不进行填充。当需要预留(Reserve)特定大小的内存,之后回到这个缓冲填充的时候会很有用。

glBufferSubData

填充缓冲的特定区域。参数为缓冲目标、偏移量、数据大小和数据本身。
偏移量用于指定从何处开始填充这个缓冲,使得可以插入或更新部分缓冲内存。
缓冲要有足够的已分配内存,所以对一个缓冲调用 glBufferSubData前必须要先调用glBufferData

glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data); // 范围: [24, 24 + sizeof(data)]
glMapBuffer

请求缓冲内存的指针,直接将数据复制到缓冲当中。

float data[] = {
  0.5f, 1.0f, -0.35f
  ...
};
glBindBuffer(GL_ARRAY_BUFFER, buffer);
// 获取指针
void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
// 复制数据到内存
memcpy(ptr, data, sizeof(data));
// 记得告诉OpenGL我们不再需要这个指针了
glUnmapBuffer(GL_ARRAY_BUFFER);
glUnmapBuffer

用于指针操作完成后解除映射,指针将不再可用,并且如果数据成功映射到缓冲中则返回GL_TRUE

分批顶点属性
float positions[] = { ... };
float normals[] = { ... };
float tex[] = { ... };
// 填充缓冲
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(positions), &positions);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions), sizeof(normals), &normals);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions) + sizeof(normals), sizeof(tex), &tex);

//更新顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);  
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(sizeof(positions)));  
glVertexAttribPointer(
  2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(positions) + sizeof(normals)));


复制缓冲

glCopyBufferSubData能从一个缓冲中复制数据到另一个缓冲中。

void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset,
                         GLintptr writeoffset, GLsizeiptr size);

readtarget: 填入复制源
writetarget: 复制目标的缓冲目标。

如果读写数据的两个不同缓冲都为顶点数组缓冲可以使用GL_COPY_READ_BUFFERGL_COPY_WRITE_BUFFER作为readtargetwritetarget参数。

float vertexData[] = { ... };
glBindBuffer(GL_COPY_READ_BUFFER, vbo1);
glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));

也可以只将writetarget缓冲绑定为新的缓冲目标类型之一:

float vertexData[] = { ... };
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opengl学习-高级数据 的相关文章

  • “RouteCollection”不包含“MapMvcAttributeRoutes”的定义

    我尝试使用基于属性的路由 但是当我尝试以下代码片段来激活基于属性的路由时 我收到以下错误消息 RouteCollection 不包含定义 MapMvcAttributeRoutes 这是我的代码 public class RouteConf
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 可变数量的(常量)引用参数

    我试图从我的高级代码 使用 C 11 中消除原始指针 并且我找到了引用 尤其是const 在许多情况下 当没有所有权转移时 是一个很好的替代品 但如果有的话该怎么办variable我想通过 常量 引用传递的参数数量 你不能创建一个std v
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • 生成范围 [min,max] 内的随机数 [重复]

    这个问题在这里已经有答案了 我正在使用 C 生成范围 min max 内的整数随机数 我在用 int random int int min int max return min rand max min 但我认为上面的代码适用于范围 min
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码
  • 返回 ICollection 而不是 List 的真正优势是什么? [复制]

    这个问题在这里已经有答案了 我读过几篇博客文章 提到对于公共 API 我们应该始终返回 ICollection 或 IEnumerable 而不是 List 返回 ICollection 而不是 List 的真正优势是什么 Thanks 复
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ

随机推荐

  • redhat 个人版注册订阅实现可以使用yum安装软件

    Redhat个人版使用入门 第一步安装redhat虚拟机 redhat注册订阅 创建账号 过程可能比较慢 所以需要耐心等待 第一步安装redhat虚拟机 略 如果你还不会使用虚拟机安装系统 请先移步百度如何使用虚拟机安装linux系统 re
  • mac配置vim语法高亮

    mac可能不同于linux macos都会内置了vim 和 vi 但都没有语法高亮 找到vimrc文件的位置 macos一般是在 usr share vim路径下 即 usr share vim vimrc 如果找不到这个路径 打开vim
  • GitHub的注册与使用(详细图解)

    首先 你需要注册一个 github账号 最好取一个有意义的名字 比如姓名全拼 昵称全拼 如果被占用 可以加上有意义的数字 本文中假设用户名为 chuaaqiCSDN 我的博客名的全拼 一 gihub账号注册与仓库创建 1 注册账号 地址 h
  • 解决adobe firefly 无法加载msvcp.dll的

    问题 在运行adobe firefly的运行程序的时候报错 adobe photoshop firefly unable to load a required component msvcp140 dll 解决方法 1 访问网页 Lates
  • xxl-job的使用以及与spring boot整合

    官网教程 中文教程 gitee https gitee com xuxueli0323 xxl job github https github com xuxueli xxl job xxl job主要分为调度中心和执行器项目 调度中心对应
  • Java8函数式编程

    文章目录 Java8函数式编程 简介 为什么需要再次修改Java 什么是函数式编程 Lambda表达式 引用值 而不是变量 函数接口 类型推断 流 常用的流操作 生成流 collect toList 返回集合 map将一个流中的值转为另一个
  • 算法训练营第十九天(8.1)

    目录 LeeCode530 Minimum Absolute Difference in BST LeeCode501 Find Mode in Binary Search Tree LeeCode236 Lowest Common Anc
  • 梯度下降的三种形式——BGD、SGD、MBGD

    机器学习里面 梯度下降法可以说是随处可见 虽然它不是什么高大上的机器学习算法 但是它却是用来解决机器学习算法的良药 我们经常会用到梯度下降法来对机器学习算法进行训练 BGD SGD MBGD 也就是批量梯度下降法BGD 随机梯度下降法SGD
  • 如何用Redis实现用户关注

    Redis实现互相关注功能 在实现社交网络功能中 实现互相关注是必不可少的 在这里 我们将使用Redis来实现这个功能 前端使用Vue框架实现 功能要求 我们需要实现以下几个功能 用户能够关注其他用户 用户能够取消关注其他用户 用户能够查看
  • this.$emit使用方法【前端技术】

    this emit 主要用于子组件向父组件传值 下面就给大家举一个实际开发中使用到的案例 需求 点击关联项目 弹出关联项目数据进行选择一条数据 点击确定 项目编号会回显到关联项目中 1新增页面 2 新增页面中点击关联项目弹出的页面 3实现效
  • APP生成器原理

    很久之前看到过APP生成器 作用 如图 你选择写几句话 然后填写APP名称和启动图 图标等东西即可立即生成一个属于你的APP 原理 通过修改文件就行 当然你的模板APP在内容上调用资源文件中的资源 如我的APP 调用资源文件中的txt 实现
  • 解决“Linux无法登录,显示module is unknown”问题

    问题描述 今天用secureCRT连接不上centos7系统 打开vSphere client的虚拟机控制台 输入用户名与密码 显示 module is unknown 无法登陆 解决方法 一 设置虚机从emergency模式启动 对于虚拟
  • android service单独进程,Android 通过Service单独进程模仿离线推送 Server Push

    概述 首先简单阐述一下我对于消息推送的理解 这里拿QQ来举例吧 当我们手机端的QQ离线了 并且退出了QQ应用 但是这时候如果别人给我们发了信息 我们没有上线 服务器会将发送者发送的信息推送过来然后我们发布通知来显示通知我们的用户 原理简单阐
  • 【国际短信】功能开发经验及具体开发实现

    经过通道测试 目前支持大多数国家和地区 下面提供C 和Java两种编程语言的Demo示例 一 国际短信SDK http sdk2 entinfo cn 8060 gjWebService asmx mdSmsSend g sn string
  • 经常在.net中使用的下载链接地址

    http www cnblogs com xdotnet archive 2011 04 17 util urls html
  • 进化算法简单介绍

    进化算法又称启发式算法 是利用经验法则或者常识来解决问题的方法 图片来自参考文献 1 1 元启发式算法和启发式算法有什么区别 启发式策略 heuristic 启发式算法 Heuristic Algorigthm 是一种基于直观或经验构造的算
  • endnote插入参考文献,引文如何变[1-3]为[1]-[3]?

    第一步 编辑参考样式 如图所示 2 把勾勾去掉 把 变成 如图所示 3 结果如下图所示 4 变成 1 3 还需要在word中操作 先插入第一篇 然后加上 再插入第二篇 第三篇 结果如下图所示 5 然后点这里 把第二篇 不需要展现的 选择sh
  • 一个恶搞vbs脚本

    这期小编就不讲解了 直接上代码 Msgbox Windows安全中心无法正常启动 48 系统错误 Msgbox Windows资源管理器无法正常启动 48 系统错误 Msgbox 系统中断无法正常启动 48 系统错误 Msgbox 命令提示
  • 网络常见面试题

    1 OSI Open System Interconnect 开放系统互联 是一个七层的计算机网络模型 分别为 物理层 数据链路层 网络层 传输层 会话层 表示层和应用层 TCP IP Transmission Control Protoc
  • opengl学习-高级数据

    glBufferData函数 填充整个缓冲对象 会分配一块内存 并将数据添加到这块内存中 如果data为NULL则只分配内存不进行填充 当需要预留 Reserve 特定大小的内存 之后回到这个缓冲填充的时候会很有用 glBufferSubD