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

本文详细介绍了OpenGL中的缓冲对象管理,包括glBufferData和glBufferSubData的使用,以及如何通过glMapBuffer直接将数据复制到缓冲中。此外,文章还探讨了分批顶点属性的设置和缓冲数据的复制。在GLSL方面,讲解了内建变量如gl_Position、gl_PointSize和gl_FragCoord的用途,以及如何利用gl_FrontFacing和gl_FragDepth实现不同效果。最后,文章讨论了Uniform缓冲对象,包括接口块、布局规则和如何将数据填充到缓冲中。

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

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能容易地从一个缓冲中复制数据到另一个
缓冲中。原型如下:

代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值