LearnOpenGL学习笔记——高级数据

【ChatGPT】利用Advanced Data Analysis进行数据分析 现需要对一批已经脱敏的学生考试数据进行分析,尝试利用chatgpt来完成,体验code interpreter的功能。 阅读详情

高级数据

我们在OpenGL中大量使用缓冲来存储数据已经有很长时间了。操作缓冲其实还有更有意思的方式,而且使用纹理将大量输出传入着色器也有更有趣的方法。这一节中,我们将讨论一些更有意思的缓冲函数,以及我们该如何使用纹理来存储大量的数据(纹理部分还没有完成)。

OpenGL中的缓冲只是一个管理特定内存块的对象,没有其它更多的功能了。在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲,但我们也可以很容易地将其绑定到GL_ELEMENT_ARRAY_BUFFER。OpenGL内部会为每个目标储存一个缓冲,并且会根据目标的不同,以不同的方式处理缓冲。

到目前为止,我们一直是调用glBufferData函数来填充缓冲对象所管理的内存,这个函数会分配一块内存,并将数据添加到这块内存中。如果我们将它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充。这在我们需要预留(Reserve)特定大小的内存,之后回到这个缓冲一点一点填充的时候会很有用。

除了使用一次函数调用填充整个缓冲之外,我们也可以使用glBufferSubData,填充缓冲的特定区域。这个函数需要一个缓冲目标、一个偏移量、数据的大小和数据本身作为它的参数。这个函数不同的地方在于,我们可以提供一个偏移量,指定从何处开始填充这个缓冲。这能够让我们插入或者更新缓冲内存的某一部分。要注意的是,缓冲需要有足够的已分配内存,所以对一个缓冲调用glBufferSubData之前必须要先调用glBufferData。

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

将数据导入缓冲的另外一种方法是,请求缓冲内存的指针,直接将数据复制到缓冲当中。通过调用glMapBuffer函数,OpenGL会返回当前绑定缓冲的内存指针,供我们操作:

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函数,告诉OpenGL我们已经完成指针操作之后,OpenGL就会知道你已经完成了。在解除映射(Unmapping)之后,指针将会不再可用,并且如果OpenGL能够成功将您的数据映射到缓冲中,这个函数将会返回GL_TRUE。如果要直接映射数据到缓冲,而不事先将其存储到临时内存中,glMapBuffer这个函数会很有用。比如说,你可以从文件中读取数据,并直接将它们复制到缓冲内存中。

分批顶点属性

通过使用glVertexAttribPointer,我们能够指定顶点数组缓冲内容的属性布局。在顶点数组缓冲中,我们对属性进行了交错(Interleave)处理,也就是说,我们将每一个顶点的位置、法线和/或纹理坐标紧密放置在一起。既然我们现在已经对缓冲有了更多的了解,我们可以采取另一种方式。

我们可以做的是,将每一种属性类型的向量数据打包(Batch)为一个大的区块,而不是对它们进行交错储存。与交错布局123123123123不同,我们将采用分批(Batched)的方式111122223333。

当从文件中加载顶点数据的时候,你通常获取到的是一个位置数组、一个法线数组和/或一个纹理坐标数组。我们需要花点力气才能将这些数组转化为一个大的交错数据数组。使用分批的方式会是更简单的解决方案,我们可以很容易使用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来填充缓冲,但对于这种工作,使用glBufferSubData会更合适一点。

我们还需要更新顶点属性指针来反映这些改变:

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)));

这给了我们设置顶点属性的另一种方法。使用哪种方法都不会对OpenGL有什么立刻的好处,它只是设置顶点属性的一种更整洁的方式。具体使用的方法将完全取决于你的喜好与程序类型。

复制缓冲

当你的缓冲已经填充好数据之后,你可能会想与其它的缓冲共享其中的数据,或者想要将缓冲的内容复制到另一个缓冲当中。glCopyBufferSubData能够让我们相对容易地从一个缓冲中复制数据到另一个缓冲中。这个函数的原型如下:

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

readtarget和writetarget参数需要填入复制源和复制目标的缓冲目标。比如说,我们可以将VERTEX_ARRAY_BUFFER缓冲复制到VERTEX_ELEMENT_ARRAY_BUFFER缓冲,分别将这些缓冲目标设置为读和写的目标。当前绑定到这些缓冲目标的缓冲将会被影响到。

但如果我们想读写数据的两个不同缓冲都为顶点数组缓冲该怎么办呢?我们不能同时将两个缓冲绑定到同一个缓冲目标上。正是出于这个原因,OpenGL提供给我们另外两个缓冲目标,叫做GL_COPY_READ_BUFFER和GL_COPY_WRITE_BUFFER。我们接下来就可以将需要的缓冲绑定到这两个缓冲目标上,并将这两个目标作为readtarget和writetarget参数。

接下来glCopyBufferSubData会从readtarget中读取size大小的数据,并将其写入writetarget缓冲的writeoffset偏移量处。下面这个例子展示了如何复制两个顶点数组缓冲:

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));

有了这些关于如何操作缓冲的额外知识,我们已经能够以更有意思的方式使用它们了。当你越深入OpenGL时,这些新的缓冲方法将会变得更加有用。

知识点总结:

1.glBufferSubData可以用来填充缓冲区域
2.glMapBuffer函数可以请求缓冲内存,直接复制数据到缓冲中。记得glUnmapBuffer缓冲指针。
3.可以分批处理数据或者说将属性数组作为一个整体传递给缓冲(通过glBufferSubData填充缓冲,并使用glVertexAttribPointer绑定)
4.可以使用glCopyBufferSubData复制缓冲数据到另一个缓冲中

https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/07%20Advanced%20Data/

【LearnOpenGL 学习笔记】高级OpenGL LearnOpenGL 学习笔记 高级OpenGL 阅读详情

相关推荐

LearnOpenGL CN学习笔记(一)

懒得弄 学习笔记而已

weixin_43839880的博客 1205

OpenGL学习笔记一之高级OpenGL篇七 高级数据

转载自https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/07%20Advanced%20Data/ 我们在OpenGL中大量使用缓冲来储存数据已经有很长时间了。操作缓冲其实还有更有意思的方式,而且使用纹理将大量数据传入着色器也有更有趣的方法。这一节中,我们将讨论一些更有意思的缓冲函数,以及我们该如何使用纹理对象来储存大量的数据(纹理...

飞飞飞的博客 408

learnOpenGL 4.7 高级数据

分批顶点 通常我们使用交错布局处理顶点数据,与交错布局123123123123不同,我们也可以采用分批(Batched)的方式111122223333。 我们可以先用glBufferData函数预留一块内存,如果我们将它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充。 然后使用glBufferSubData函数填充缓存。一个缓冲目标、一个偏移量、数据的大小和数据本身作为它的参数。 要注意的是,缓冲需要有足够的已分配内存,所以对一个缓冲调用glBufferSubData之前必须要先调用

qq_43533956的博客 267

LearnOpenGL CN 中文官方主页

LearnOpenGL CN 中文官方主页 1.https://learnopengl-cn.github.io/ openGL入门的最好教材之一 点击下一节 上面图片的红色线框内 可以看到英文原版,和中文翻译,以及随时源码 ...

aoxuestudy的专栏 9201

Advanced Data Import 3.13 D11.rar

EMS高级数据导入VCL是Borland Delphi和C++ Builder的组件套件,允许您从最流行的数据格式的文件导入数据到数据库。您可以从MS Excel、MS Access、DBF、XML、TXT、CSV、ODF和HTML导入数据。无需在烦人的数据转换上浪费时间-高级数据导入将快速完成任务,而不管源数据格式如何。

ArduSub程序学习(1)——ardupilot框架整理

AP_HAL层(硬件抽象层)是我们制作 ArduPilot 的方式可移植到许多不同的平台。有一个顶级AP_HAL libraries/AP_HAL,用于定义代码其余部分的接口 有针对具体的板子特性,然后就有了AP_HAL_XXX 子目录,例如,AP_HAL_AVR 用于基于 AVR 的 开发板,AP_HAL_PX4用于 Pixhawk 开发板和 AP_HAL_Linux 基于 Linux 开发板。工具目录tools directories工具目录是杂项支持目录。

weixin_49839886的博客 2813

LearnOpenGL笔记(一)入门

learnopengl的入门简介。包括创建窗口,绘制三角形,实现FPS摄像机,纹理,着色器

weixin_44683202的博客 1536

ENVI 5.6保姆级教程:高分七号DLC影像从打开到融合的完整流程(附避坑指南)

本文详细介绍了ENVI 5.6处理高分七号DLC影像的完整流程,包括环境准备、数据解压、正射校正、图像融合等关键步骤。特别针对国产卫星数据处理的独特挑战,提供了实用的避坑指南和优化技巧,帮助用户高效完成光学影像的预处理和质量提升。

weixin_33269743的博客 382

LearnOpenGL学习笔记—高级OpenGL 07-08:高级数据/高级GLSL

LearnOpenGL学习笔记—高级OpenGL 07-08:高级数据/高级GLSL 1 高级数据1.1回顾1.2 分批顶点属性1.3 复制缓冲2 高级GLSL2.1 GLSL的内建变量2.1.1 顶点着色器变量2.1.1.1 gl_PointSize2.1.1.2 gl_VertexID2.1.2 片段着色器变量2.1.2.1 gl_FragCoord2.1.2.2 gl_FrontFacing2.1.2.3 gl_FragDepth2.2 接口块2.3 Uniform缓冲对象2.3.1 Uniform块

清清!的博客 870

AI办公Agent技术:文档与表格智能处理实践

办公自动化技术正从规则驱动转向语义理解,大语言模型(LLM)为办公Agent赋予了智能决策能力。这类系统通过五层架构整合自然语言处理、工具API调用和任务规划引擎,能自动完成文档分类、表格分析等高重复性工作。关键技术包括基于TF-IDF和BERT的特征提取、Excel公式自动生成等,在财务报告、法律审查等场景可实现90%以上的效率提升。随着多模态能力和领域专业化发展,办公Agent正在重塑企业文档处理流程,成为数字化转型的核心基础设施。

weixin_30263277的博客 519

手把手教你学SIMULINK模块库文件专栏-From Workspace 模块详解

模块是 Simulink 中的一个信号源模块,用于从 MATLAB 工作区加载数据作为输入信号。该模块允许用户将预先在 MATLAB 中生成的数据(如时间序列、矩阵或结构体)导入到 Simulink 模型中,从而实现更灵活的信号输入和仿真控制。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常灵活的工具,适用于需要从 MATLAB 工作区加载数据的各种场景。

MHD0815的博客 633

LearnOpenGL学习笔记—高级光照 01~02:高级光照/Gamma校正

LearnOpenGL学习笔记—高级光照 01-02:高级光照/Gamma校正1 高级光照2 Gamma校正2.1 应用gamma矫正2.1 应用1:使用OpenGL内建的sRGB帧缓冲2.2 应用2:手动操作2.2.1 注意点1:sRGB纹理2.2.2 衰减3 实践 1 高级光照 本节对应官网学习内容:高级光照 官网基本就是讲Blinn-Phong,在入门的时候自己就额外做过了 所以附上当时的笔记:LearnOpenGL学习笔记—光照02:Lighting Basis/Advanced Lighting

清清!的博客 1113

Python爬虫实战:基于最新技术栈的晋江文学城小说爬取

本文将详细介绍如何使用Python最新技术栈构建一个高效的晋江文学城小说爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、分布式爬虫设计以及数据存储优化等高级话题。文章包含完整的代码实现,使用aiohttp+asyncio实现异步爬取,Playwright处理动态渲染,并结合Redis实现分布式任务队列。本文旨在为读者提供一个全面的现代Python爬虫开发指南。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。

2201_76125261的博客 870

LearnOpenGL学习笔记—高级OpenGL 01:深度测试

LearnOpenGL学习笔记—高级OpenGL:深度测试1 深度测试1.1 知识回顾1.2 代码实现 1 深度测试 1.1 知识回顾 本节对应官网学习内容:深度测试 我们之前其实已经在 坐标系统 这节开启了并使用了深度测试 并在games101的 光栅化 那一课也学习了Z缓冲的知识 我们接着做一点补充: 我们之前运用了深度缓冲(Depth Buffer)来防止被阻挡的面渲染到其它面的前面。 当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的的深度值与深度缓冲的内容进行对比。

清清!的博客 2503

整理 钢琴 约翰·汤普森现代钢琴(大汤)

大汤

TS的博客 3998

使用VNA(Vector Network Analyzer)对S参数进行去嵌(二)

无论是使用 EM 仿真工具创建的简化模型(如一段理想传输线)还是复杂模型用于测试夹具,现在都需要使用该 S 参数模型执行去嵌入过程。

小孟同学的博客 6108

【实践LearnOpenGL项目】高级篇

本文介绍了OpenGL中的四项高级渲染技术:1. 实例化渲染技术,通过glDraw*Instanced实现3万个陨石的高效渲染,避免了循环绘制的性能损耗;2. 离屏抗锯齿技术,通过多重采样帧缓冲和后处理帧缓冲消除图形边缘锯齿;3. 统一缓冲对象(UBO)技术,用于在多个着色器间共享矩阵和光源参数;4. 几何着色器应用,演示了通过几何着色器实现三角形爆炸效果。每种技术都配有核心代码片段和实际效果图,展示了从基础渲染到高级优化的完整解决方案。

qq_37378423的博客 2218

AI辅助Android开发:从传统到智能化的技术演进

AI辅助开发的核心在于利用算法模型自动化或优化传统任务。在Android开发中,AI可应用于需求分析、设计、编码、测试和维护各阶段。需求分析:AI工具如基于NLP的模型(例如GPT系列)可解析用户需求文档,自动生成用户故事和原型设计。假设产品需求为“开发一个航班查询应用”,AI能提取关键词,输出UML图或伪代码。代码生成:使用AI代码助手(如GitHub Copilot),工程师输入自然语言描述,AI生成Java/Kotlin代码片段。

郑伟强dev的专栏 137

LearnOpenGL——高级数据、高级GLSL

当从文件中加载数据时,得到的会是分类好的数据数组,比如会得到三个数组position[]、normal[]、texture[],而不是像我们之前使用的交错的数据数组123123123这样的。目前对于一个个uniform变量,我们还需要一个个来设置,我们可以使用Uniform缓冲对象的工具。我们能够选用的其中一个图元是GL_POINTS,每个顶点都是一个图元,都会被渲染为一个点,我们可以使用float类型的变量gl_PointSize来调整渲染出来的点的大小(可以在顶点着色器中修改这个值)。

weixin_70073176的博客 1287

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LearnOpenGL学习(高级OpenGL --> 帧缓冲,立方体贴图,高级数据)

当把一个纹理附加到帧缓冲的时候,所有的渲染指令将会写入到这个纹理中,就像它是一个普通的颜色/深度或模板缓冲一样。创建一个渲染缓冲对象和纹理对象类似,不同的是这个对象是专门被设计作为帧缓冲附件使用的,而不是纹理那样的通用数据缓冲(General Purpose Data Buffer)。我们将会将场景渲染到一个附加到帧缓冲对象上的颜色纹理中,之后将在一个横跨整个屏幕的四边形上绘制这个纹理。帧缓冲(FrameBuffer)是所有屏幕缓冲(包括颜色缓冲,深度缓冲,模板缓冲)的集合。的渲染缓冲上进行的。

zaizai1007的博客 1345

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LearnOpenGL学习笔记2-Shaders

这一节介绍了基本的GLSL语法;着色器的输入与输出;全局变量在着色器的使用;颜色属性的添加;着色器类的封装。

LLLawrenceQ的博客 1875

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LearnOpenGL学习笔记—模型加载02: Mesh

LearnOpenGL学习笔记—模型加载02: Mesh0 前言1 Mesh类1.1 Mesh.h1.2 Mesh.cpp1.2.1 构造函数1.2.2 初始化 0 前言 本节笔记对应官网学习内容:网格 在模型加载01中我们导入了assimp库。 通过使用Assimp,我们可以加载不同的模型到程序中,但是载入后它们都被储存为Assimp的数据结构。 我们最终仍要将这些数据转换为OpenGL能够理解的格式,这样才能渲染这个物体。 我们从上一节中学到,网格(Mesh)代表的是单个的可绘制实体,我们现在先来定义一

清清!的博客 1393

LearnOpenGL学习笔记—PBR:理论

LearnOpenGL学习笔记—PBR1 理论1.1 引入1.2 微表面模型1.3 能量守恒1.4 反射方程1.4.1 辐射度量学1.4.2 辐射通量(Radiant Flux)1.4.3 立体角(Solid Angle)1.4.4 辐射强度(Radiant Intensity)1.4.5 入射辐照度(Irradiance)1.4.6 出射辐射度(Radiance)1.4.6 概念:双向反射分布函数(Bidirectional ReflectanceDistribution Function,BRDF)1.

清清!的博客 2880

【实践LearnOpenGL项目】高级光照篇

本文详细介绍了OpenGL中三种图形渲染技术的实现方法:1. 阴影贴图技术:通过创建深度纹理和帧缓冲对象,从光源视角渲染场景,解决阴影伪影问题时采用PCF渐进过滤和动态阴影偏移。2. 点光源阴影技术:使用立方体贴图记录六个方向的深度信息,通过几何着色器实现单次多面渲染,并采用20次PCF采样实现柔和阴影效果。3. 法线贴图技术:利用TBN矩阵转换空间坐标,通过切线空间中的法线纹理增强表面细节表现。文章包含完整的代码实现和效果对比图,为图形渲染开发提供了实用参考。

qq_37378423的博客 1963

LearnOpenGL学习笔记—入门05:Texture

小学期终于结束了,可以回来更新了Orz,总是拖拖拉拉的(瘫 0 前言 本节笔记对应的内容 纹理 在入门01中我们配置好了环境 在入门02中我们可以检测输入并出现一个有颜色的窗口 在入门03中我们初步学习了图形渲染管线,尝试用不同方法画出了三角形和四边形 在入门04(上)中我们学习了shader和GLSL的相关知识,并给图形加上了变换的颜色以及彩色。 在入门04(下)中我们建立自己的shader类,并能够从外部读取shader的内容。 在这一节,我们将会了解有关材质的内容 1 纹理简介 在之前的学习中,我们可

清清!的博客 1867

LearnOpenGL 高级OpenGL—高级数据

文章目录写在前面高级数据分批顶点属性复制缓冲总结 写在前面 原文链接。原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题。 高级数据 我们在OpenGL中大量使用缓冲来储存数据已经有很长时间了。操作缓冲其实还有更有意思的方式,而且使用纹理将大量数据传入着色器也有更有趣的方法。这一节中,我们将讨论一些更有意思的缓冲函数,以及我们该如何使用纹理对象来储存大量的数据(纹理的部分还没有完成)。 OpenGL中的缓冲只是一个管理特定内存块的对象,没有其它更多的功能了。在我们将它绑定到一个缓

xiji333的博客 253
上一篇: LearnOpenGL学习笔记——立方体贴图
下一篇: LearnOpenGL学习笔记——高级GLSL
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值