绘制一个三角形

流程概述

  1. CPU上的顶点数据:首先,我们有一组顶点数据,存储在CPU内存中。
  2. 发送到VBO(GPU缓冲区):将这些顶点数据打包并发送到VBO(顶点缓冲对象),VBO是GPU中的缓冲区。
  3. VAO告诉GPU如何处理数据:VAO(顶点数组对象)用于告诉GPU如何处理这些数据,包括数据的位置和格式。

问题描述

在初始化阶段,我们绑定了VAO和VBO,将数据传入显存,并告诉GPU如何解析这些数据。之后,我们解绑了VAO和VBO。

在绘制阶段(例如调用paint函数时),我们重新绑定了VAO,但没有绑定VBO。

问题分析

在OpenGL中,VAO的作用是记录VBO的配置信息。一旦VAO记录了VBO的配置(包括数据格式和位置),在绘制时只需要绑定VAO即可,不需要再次绑定VBO。这是因为VAO已经存储了VBO的相关信息。

因此,在绘制阶段只需要绑定VAO,OpenGL会自动使用VAO中记录的VBO配置。

示例代码

以下是绘制三角形的代码片段,展示了VAO和VBO的绑定与解绑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 初始化阶段
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

// 绑定VAO和VBO
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

// 将顶点数据传入显存
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 告诉GPU如何解析顶点数据
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

// 解绑VAO和VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

// 绘制阶段
void paint() {
// 绑定VAO
glBindVertexArray(VAO);

// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);

// 解绑VAO
glBindVertexArray(0);
}

总结

  • VAO 记录了VBO的配置信息,因此在绘制时只需要绑定VAO,不需要再次绑定VBO。
  • VBO 用于存储顶点数据,在初始化阶段配置完成后,VAO会记住这些配置。
  • 这种设计提高了性能,减少了重复绑定的开销。
    Hexo Logo
    Hexo Logo
    Hexo Logo