OpenGL(3)对象


前言:

在 OpenGL 中,有许多常见的对象,它们在图形渲染流程中各自承担着重要的角色。下面将详细介绍几种常见对象及其工作原理。

一、对象

1、顶点缓冲区对象(Vertex Buffer Object,VBO)

概念:

顶点缓冲区对象用于在 GPU 内存中存储顶点数据,如顶点的位置、颜色、法线等。通过使用 VBO,可以减少 CPU 与 GPU 之间的数据传输开销,提高渲染性能。

工作原理:

  • 创建与绑定:使用 glGenBuffers 函数创建一个或多个 VBO 对象,然后使用 glBindBuffer 函数将其绑定到 GL_ARRAY_BUFFER 目标。绑定后,后续对缓冲区的操作都会作用于该 VBO。
  • 数据存储:使用 glBufferData 函数将顶点数据从 CPU 内存复制到 GPU 内存中的 VBO 中。可以指定数据的使用方式,如 GL_STATIC_DRAW(数据很少更改)、GL_DYNAMIC_DRAW(数据经常更改)等。
  • 使用数据:在顶点着色器中,通过顶点属性指针从 VBO 中读取顶点数据进行处理。

示例代码:

// 创建 VBO
unsigned int VBO;
glGenBuffers(1, &VBO);
// 绑定 VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// 将顶点数据存入 VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

2、顶点数组对象(Vertex Array Object,VAO)

概念:

顶点数组对象是一种用于管理顶点属性状态的对象。它存储了顶点属性的配置信息,包括顶点缓冲区对象(VBO)的绑定状态、顶点属性指针的设置等。通过 VAO,可以方便地切换不同的顶点属性配置。

工作原理:

  • 创建与绑定:首先使用 glGenVertexArrays 函数创建一个或多个 VAO 对象,然后使用 glBindVertexArray 函数将其绑定到当前的 OpenGL 上下文。绑定后,后续对顶点属性的设置操作都会记录在该 VAO 中。
  • 关联 VBO:在 VAO 绑定的状态下,创建并绑定顶点缓冲区对象(VBO),使用 glBufferData 函数将顶点数据存储到 VBO 中。
  • 设置顶点属性指针:使用 glVertexAttribPointer 函数设置顶点属性的指针,指定每个属性的起始位置、数据类型、数据数量等信息。这些设置会被记录在当前绑定的 VAO 中。
  • 切换 VAO:当需要切换到不同的顶点属性配置时,只需绑定不同的 VAO,OpenGL 会自动恢复该 VAO 所记录的顶点属性设置。

示例代码:

// 创建并绑定VAO
glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);

// 设置顶点属性指针
// 位置属性 (location = 0)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);

// 解绑VAO
glBindVertexArray(0);

3、glVertexAttribPointer()函数

作用:

告诉 OpenGL 如何解析顶点缓冲区对象(VBO)中存储的顶点数据。

函数原型:

void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, 
GLsizei stride, const GLvoid * pointer);

参数解析:

各参数的含义如下:

  • index:指定要配置的顶点属性的索引。在 OpenGL 着色器程序中,每个顶点属性都有一个唯一的索引,用于标识该属性。例如,顶点的位置属性可能索引为 0,颜色属性可能索引为 1。
  • size:表示每个顶点属性由多少个组件组成。例如,顶点的位置通常是三维坐标(x, y, z),所以 size 为 3;如果是二维纹理坐标(s, t),则 size 为 2。
  • type:指定顶点属性中每个组件的数据类型,常见的取值有 GL_FLOAT(浮点数)、GL_INT(整数)等。
  • normalized:一个布尔值,指示当数据类型不是浮点数时,是否需要对数据进行归一化处理。如果设置为 GL_TRUE,则会将数据归一化到 [0, 1](无符号数据)或 [-1, 1](有符号数据)的范围内;如果设置为 GL_FALSE,则数据会直接使用,不进行归一化。
  • stride:表示相邻两个顶点属性之间的字节偏移量,即从一个顶点的某个属性到下一个顶点的相同属性之间的距离。如果顶点数据是紧密排列的,没有额外的填充字节,stride 可以设置为 size * sizeof(type);如果顶点数据中包含多种属性,stride 则需要根据实际情况计算。
  • pointer:表示当前顶点属性在 VBO 中的起始偏移量,通常是一个指向 VBO 中数据起始位置的指针。如果该属性是 VBO 中第一个属性,pointer 可以设置为 (GLvoid*)0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值