您现在的位置是:首页 > 正文

第三十八章 立方体贴图和GLSL总结

2024-02-01 06:49:05阅读 2

学习一些缓冲函数,以及如何用纹理对象来存储大量的数据。

OpenGL中的缓冲是一个管理特定内存块的对象,没有额外的功能。将它绑定到一个缓冲目标时,才有意义。当前,是使用glBufferData来填充缓冲对象管理的内存,
该函数会分配一块内存,并将数据添加到这块内存中。如果将data参数设置为NULL,那么这个函数只会分配内存,但不进行填充。需要预留特定大小的内存。

现在看下函数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);————解除映射后,指针就不再可用了
如果OpenGL能够成功将数据映射到缓冲中,这个函数就会返回GL_TRUE

使用点:
直接映射数据到缓冲,而不事先将其存储到临时内存中,使用glMapBuffer挺好。
可以从文件中读取数据,并直接将它们复制到缓冲内存中。

了解一下:分批顶点属性
通过使用glVertexAttribPointer,可以指定顶点数组缓冲内容的属性布局。
因为,顶点数组中,属性是交错处理的,每一个顶点的位置,法线,纹理坐标都是放到一起的。分批顶点属性是另外一种处理方法:
将每一种属性类型的向量数据打包为一个大的区块,而不是对他们进行交错存储。
当从文件中加载顶点数据的时候,通常获取到的是一个位置数组,一个法线数组和(如果有的话:一个纹理坐标数组)。
可以用分批的方式解决该问题:使用glBufferSubData函数
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);
这样就直接将属性数组作为一个整体传递给缓冲,而不需要事先处理它们。也可以合并成一个大数组,再使用glBufferData来填充。

还需要更新顶点属性指针来反应这些改变:
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)));

stride参数等于顶点属性的大小,因为下一个顶点属性 向量能在x个分量之后找到。

下面看下:复制缓冲
缓冲填充好数据后,可以与其他的缓冲共享其中的数据,或者要将缓冲的内容复制到另一个缓冲当中。glCopyBufferSubData能容易地从一个缓冲中复制数据到另一个
缓冲中。原型如下:

网站文章

  • Linux 安装Apache 记录

    Linux 安装Apache 记录

    linux下Apache源码编译安装1.下载并安装APR  http://apr.apache.org/wget -c http://mirrors.hust.edu.cn/apache//apr/apr-1.6.2.tar.bz2执行解压命令 tar -xjvf 文件名 解压后切换到目录执行命令配置 :./configure --prefix=/usr/l

    2024-02-01 06:48:35
  • Eclipse RCP入门(创建一个日期选择器)

    直接上代码。 [code="java"]package org.autumn.rcp.learn; import java.util.Calendar; import java.u...

    2024-02-01 06:47:56
  • C++描述 LeetCode 1004. 最大连续1的个数 III

    C++描述 LeetCode 1004. 最大连续1的个数 III   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中...

    2024-02-01 06:47:50
  • 【实战】阿里云https证书申请与部署

    【实战】阿里云https证书申请与部署

    文章目录阿里云https证书申请与部署1.证书申请2.证书部署 阿里云https证书申请与部署 1.证书申请 登录阿里云官网:https://www.aliyun.com/ 搜索ssl,点进第一个搜索结果 滑到底 选择免费证书,点击购买 再次点击立即购买 去支付 确认支付 支付成功,返回证书控制台 未签发栏下点击证书申请 填写申请需要的相关内容,点击下一步: 进行信息验证(上面...

    2024-02-01 06:47:43
  • 为什么要反弹shell

    我也不知道这个比喻恰不恰当:首先是一个城池,我想要控制这个城,就要控制这个城的城主,我手里有控制当前城主的把柄(shell)但是我要和城主建立起联系才可以控制他,城外有一座大墙(防火墙),会严格检查入...

    2024-02-01 06:47:12
  • 0202性能分析-索引-MySQL

    0202性能分析-索引-MySQL

    0202性能分析-索引-MySQL

    2024-02-01 06:47:06
  • 傅里叶变换,其物理意义是什么?(转)

    1、为什么要进行傅里叶变换,其物理意义是什么?傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。和傅立叶变换算法对应的是反傅立

    2024-02-01 06:46:58
  • (python)诗词排版(横排)

    完成了数据输入,其中poem存储了一首诗(无标点),n可能是5或者7,代表poem是五言诗或者七言诗。此代码可以帮助新手更加直观地认识python的作用。ju 代表的是本诗一共有多少句。利用for循环进行排版。

    2024-02-01 06:46:51
  • 轻松模拟数据库

    测试驱动的开发真是太好了! 在组织中建立它之后,您将开始: 极大地提高您的质量(事情不常发生) 大大改善您的流程(事情可以更轻松地更改) 极大地改善您的开发人员氛围(事情更有趣) 进行正确的测试驱动开发的重要性是找到要覆盖的代码的良好比例。 通过自动单元测试 通过自动集成测试 通过手动“烟雾测试” 通过手动的“验收测试” 一点也不 找到该比例可...

    2024-02-01 06:46:20
  • Ubuntu20.04 安装 ROS2

    官方文档

    2024-02-01 06:46:13