OpenGL Chan视频学习-5 Vertex Attributes and Layouts in OpenGL
bilibili视频链接:
【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p=5&vd_source=44b77bde056381262ee55e448b9b1973
一、知识点整理
1.1.OpenGL管线工作流程
- 为显卡提供绘制的所有数据,并将数据存储在GPU内存
- 使用着色器,即在GPU上执行的一种程序,来读取数据并将其显示在屏幕上
- 绘制图形时使用顶点缓存,即GPU一块内存。所以着色器开始读取时,顶点缓存需要知道缓存层,它包含在缓存区,是一大堆浮点数,决定每个顶点的位置。
- 还要告诉OpenGL像坐标、纹理、法线等、以及在内存里面有什么,是如何布局的
1.2 Vertex
- Vertex不只是顶点
- 还可以包含一些定点相关的信息。颜色、纹理、坐标、法线等。
1.3 glVertexAttribPointer
1.3.1 c规范
1.3.2 功能
定义一个通用顶点属性数据数组
1.3.3参数
index
指定要修改的通用顶点属性的索引。
size
指定每个通用顶点属性的组件数。必须是1、2、3、4。此外,符号常量GL_BGRA
被glVertexAttribPointer
接受。初始值是4。
type
指定数组中每个组件的数据类型。符号常量GL_BYTE
、GL_UNSIGNED_BYTE
、GL_SHORT
、GL_UNSIGNED_SHORT
、GL_INT
和GL_UNSIGNED_INT
被glVertexAttribPointer
和glVertexAttribIPointer
接受。此外GL_HALF_FLOAT
、GL_FLOAT
、GL_DOUBLE
、GL_FIXED
、GL_INT_2_10_10_10_REV
、GL_UNSIGNED_INT_2_10_10_10_REV
和GL_UNSIGNED_INT_10F_11F_11F_REV
被glVertexAttribPointer
接受。GL_DOUBLE
也被glVertexAttribLPointer
接受,并且是该函数的type
参数中唯一被接受的令牌。初始值是GL_FLOAT
。
normalized
对于glVertexAttribPointer
,指定当固定点数据值被访问时,是否应该进行归一化 (GL_TRUE
) 或直接作为固定点值进行转换 (GL_FALSE
)。
stride
指定连续的通用顶点属性之间的字节偏移量。如果 stride
为0,则通用顶点属性在数组中被认为是紧密包装的。初始值为0。
步幅。每个顶点之间的字节数量。一个顶点的多个字节被分配给多个属性,如纹理、颜色等。
pointer
指定缓冲区中当前绑定到GL_ARRAY_BUFFER
目标的数据存储中第一个通用顶点属性数组的第一个组件的偏移量。初始值为0。
1.3.4示例
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
1.4 glEnableVertexAttribArray
1.4.1 c规范
1.4.2 功能
启用或禁用通用顶点属性数组
1.4.3参数
-
vaobj
指定用于glDisableVertexArrayAttrib
和glEnableVertexArrayAttrib
函数的顶点数组对象名称。
-
index
指定要启用或禁用的通用顶点属性的索引。
1.4.4示例
glEnableVertexAttribArray(0);
二、代码
2.1 代码
#include <GL/glew.h>
#include <GLFW/glfw3.h>#include<iostream>int main(void)
{GLFWwindow* window;//初始化glfwif (!glfwInit())return -1;//创建一个窗口模式的窗口并设置OpenGL上下文window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);if (!window)//如果窗口创建失败,则终止程序{glfwTerminate();//释放glfw资源return -1;}//设置当前窗口的上下文,之后所有的OpenGL调用都会在这个上下文中进行glfwMakeContextCurrent(window);//初始化GLEWif (glewInit() != GLEW_OK)std::cout << "Error!" << std::endl;//打印OpenGL版本信息std::cout << glGetString(GL_VERSION) << std::endl;//准备数据float position[6] = {0.0f, 0.5f,-0.5f, -0.5f,0.5f, -0.5f};unsigned int buffer;glGenBuffers(1, &buffer);glBindBuffer(GL_ARRAY_BUFFER, buffer);glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), position, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);//渲染循环,直到窗口被关闭while (!glfwWindowShouldClose(window)){//这部分主要:渲染窗口内容glClear(GL_COLOR_BUFFER_BIT);//刷新缓冲区并交换窗口glfwSwapBuffers(window);//处理窗口事件,如键盘输入、鼠标移动等glfwPollEvents();}glfwTerminate();return 0;
}
2.2运行结果
相关文章:

OpenGL Chan视频学习-5 Vertex Attributes and Layouts in OpenGL
bilibili视频链接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 一、知识点整理 1.1.OpenGL管线工作流程 为显卡提供绘制的所有数据,并将数据存储在GPU内存使用着色器&…...

ESP32学习笔记_Peripherals(3)——ADC
摘要 本博客介绍了ESP32-S3芯片内置SAR ADC的原理、参考电压、分辨率、信号衰减等基础知识,并讲解了如何使用ESP-IDF驱动库实现ADC的连续采样(DMA)功能,演示了多通道模拟信号(如摇杆模块)的采集与处理流程…...

QT学习一
对于选择qmake还是cmake,现在写的暂时先用qmake 1.命名规范和快捷键 2.按钮控件常用API //创建第一个按钮QPushButton * btn new QPushButton;//让btn对象 依赖在mywidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");//创建…...

黑马点评Reids重点详解(Reids使用重点)
目录 一、短信登录(redisseesion) 基于Session实现登录流程 🔄 图中关键模块解释: 利用seesion登录的问题 设计key的具体细节 整体访问流程 二、商户查询缓存 reids与数据库主动更新的三种方案 缓存穿透 缓存雪崩问题及…...

小米2025年校招笔试真题手撕(一)
一、题目 小A每天都要吃a,b两种面包各一个。而他有n个不同的面包机,不同面包机制作面包的时间各不相同。第i台面包机制作a面包 需要花费ai的时间,制作b面包则需要花费bi的时间。 为能尽快吃到这两种面包,小A可以选择两个不同的面包机x&…...

《软件工程》第 11 章 - 结构化软件开发
结构化软件开发是一种传统且经典的软件开发方法,它强调将软件系统分解为多个独立的模块,通过数据流和控制流来描述系统的行为。本章将结合 Java 代码示例、可视化图表,深入讲解面向数据流的分析与设计方法以及实时系统设计的相关内容。 11.1 …...
MongoDB基础知识(浅显)
一、MongoDB 核心概念 MongoDB 是一个 面向文档的 NoSQL 数据库,与传统的关系型数据库(如 MySQL)相比,最大的区别是它以 文档(Document)为存储单元,而不是表和行。 1. 数据库(Data…...

Neo4j(三) - 使用Java操作Neo4j详解
文章目录 前言一、创建项目二、导入依赖三、节点和关系数据打印四、创建节点与关系五、查询数据方法六、更新数据方法七、删除节点与关系方法八、合并数据方法九、完整代码1. 完整代码2. 项目下载 前言 本文介绍通过 Java 操作 Neo4j 图数据库的完整流程。主要涵盖开发环境搭建…...
MPI实现大数据Ring Broadcast逻辑
文章目录 MPI实现大数据Ring Broadcast逻辑Ring Broadcast基本原理MPI实现代码优化建议性能考虑 MPI实现大数据Ring Broadcast逻辑 Ring Broadcast是一种在并行计算中高效传播大数据的技术,特别适合在MPI环境中使用。下面我将介绍如何用MPI实现这种广播逻辑。 Rin…...

蓝桥杯3503 更小的数
问题描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串,下标从 0 到 n−1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。 小蓝想要将选出的子…...
高并发下使用防重表做防重案例
工作中遇到的重复数据产生的问题: 之前提供的一个批量复制商品的接口,产生了重复的商品数据。 针对于这个问题我想到了可以加一张防重表,在防重表中增加商品表的name和model字段作为唯一索引。 例如: CREATE TABLE product_uniq…...

算法-全排列
1、全排列函数的使用 举例:{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…...

最好用的wordpress外贸主题
产品展示独立站wordpress主题 橙色的首页大banner外贸英文wordpress主题,适合用于产品展示型的外贸网站。 https://www.jianzhanpress.com/?p8556 Machine机器wordpress模板 宽屏简洁实用的wordpress外贸建站模板,适合工业机器生产、加工、制造的外贸…...

2025 河北ICPC( D. 金泰园(二分)-- C.年少的誓约(公式转化))
文章目录 2025 河北ICPCD. 金泰园(二分)C.年少的誓约(公式转化)总结 2025 河北ICPC 题目链接: Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 赛时:5道 D. 金泰…...

mongodb语法$vlookup性能分析
1 场景描述 mongodb有两个表department和user表, department表有_id,name,level,表有记录169w条 user表有_id,name,department_id,表有记录169w条,department_id没有创建索引,department_id是department的_id。 现…...

晶圆隐裂检测提高半导体行业效率
半导体行业是现代制造业的核心基石,被誉为“工业的粮食”,而晶圆是半导体制造的核心基板,其质量直接决定芯片的性能、良率和可靠性。晶圆隐裂检测是保障半导体良率和可靠性的关键环节。 晶圆检测 通过合理搭配工业相机与光学系统,…...
临床试验中的独立数据监查委员会
1. IDMC会议概况 1.1 核心职责 1.1.1 安全性监查 IDMC需评估不良事件(AE)和严重不良事件(SAE),确保受试者风险可控。这是其核心职责之一,通过严格的安全性监查,保障受试者的健康和安全,避免因试验带来的不可控风险。 1.1.2 有效性评估 在预先设定的期中分析中,IDMC要…...

在 LangChain 中集成 Mem0 记忆系统教程
目录 简介环境准备基础配置核心组件说明1. 提示模板设计2. 上下文检索3. 响应生成4. 记忆存储 工作流程解析使用示例关键特性完整代码与效果 简介 Mem0 是一个强大的记忆系统,可以帮助 AI 应用存储和检索历史对话信息。本教程将介绍如何在 LangChain 应用中集成 Me…...
PTA练习题
文章目录 L1-101 别再来这么多猫娘了!(字符串查找-替换)L2-049 鱼与熊掌(set/暴力/vector)L2-050 懂蛇语(字符串匹配)L2-051 满树的遍历(前序)L2-001 紧急救援(最短路) L…...

华润电力招聘认知能力测评及性格测评真题题库考什么?
华润电力招聘测评包含逻辑推理、数字推理、语言理解三大类型的问卷。共计58题。测评限时60分钟。其中逻辑推理、数字推理、语言推理分别限时20分钟,如逾时未完成相关测试,测试将自动终止,请注意测评时间。为了确保测评的连贯性,建…...

Maven Profile在插件与依赖中的深度集成
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

手机平板等设备租赁行业MDM方案解析
目录 引言:MDM 在租赁行业的重要性日益凸显 用户场景:租赁公司面临的主要挑战 1. 设备丢失、逾期未还 2. 手动配置和恢复效率低 3. 非授权使用频繁 4. 时区设置混乱影响运维 5. 缺乏实时监管能力 EasyControl MDM:租赁设备的远程管控…...
【前端】使用HTTPS
在前端本地开发环境中使用 HTTPS 主要取决于你用的是哪个构建工具(如 Vite、Webpack、Vue CLI 等)。 目录 ViteWebpack本地生产环境 npx serve浏览器提示“不安全”解决方法上传github注意不要把key传上去 Vite npm install --save-dev types/node #安…...
Python应用“面向对象”小练习
大家好!面向对象编程是一种以 “对象” 为核心的编程思想。对象可以看作是具有特定属性和行为的实体。例如,一个学生可以是一个对象,他的属性包括姓名和年龄,行为可以是打招呼。 代码呈现: # 定义类和对象 class Student:def __init__(sel…...

如何调试CATIA CAA程序导致的CATIA异常崩溃问题
问题背景:我采用CATIA CAA编写了一个界面的小程序,功能运行成功,但是每次运行完,关闭CATIA的时候,都会弹出这个对话框,这个对话框的意思是CATIA运行崩溃,点击确定后,CATIA就会意外关…...

SQL查询效率以及索引设计
1. SQL 查询效率与数据库缓冲池机制 1.1. 数据库缓冲池(Buffer Pool) 磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请占用内…...

day37打卡
知识点回顾:浙大疏锦行 过拟合的判断:测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint,还包含训练状态 早停策略 作业:对信贷数据集训练后保存权重,加载权重后继续训练50…...

分布式缓存:证明分布式系统的 CAP 理论
文章目录 Pre一、分布式系统背景与特点二、CAP 三要素详解三、CAP 定理的反证证明四、CP 架构与 AP 架构对比典型场景 五、CAP 理论在系统设计中的应用六、总结 Pre 分布式缓存:CAP 理论在实践中的误区与思考 分布式缓存:BASE理论实践指南 分布式 - 从…...

软件设计师“面向对象设计”真题考点分析——求三连
一、考点分值占比与趋势分析 综合知识历年考察统计 年份考题数分值占比考察重点2018334%继承类型、设计原则2019445.3%多态实现、类关系2020556.7%设计模式应用、接口隔离2021334%消息通信、封装特性2022668%开闭原则、组合模式2023556.7%模板方法、适配器模式2024445.3%单一…...
vue项目webpack、vite、rollup、parcel四种构建工具对比
以下是 Vue 项目中使用 Webpack 与其他主流构建工具(Vite、Rollup、Parcel)的对于项目的使用对比: 一、核心工具对比 特性WebpackViteRollupParcel构建原理Bundle-based(打包)ESM-based(原生模块)Bundle-based(专注库)Zero-config(自动分析)开发速度较慢(全量打包)…...