OpenGL 基础概念

VBO(数组缓冲对象)

  • 用于存储顶点数据,如位置、颜色、法线、纹理坐标等。
  • 作用是直接把数组存到 GPU 的缓存中,提高渲染效率。

IBO/EBO(索引缓冲对象)

  • 用于存储索引数据,避免重复存储相同的顶点数据,提高渲染效率。
  • 需要使用 create / bind / allocate 进行管理。

VAO(顶点数组对象)

  • 作为管理者,记录 VBO 和 IBO 的绑定状态。
  • 不需要在每次绘制时重新设置,可在不同 VAO 之间切换,以便绘制不同的对象。
  • 只有 createbind 操作(用于成为管理者)。

顶点属性指针

  • 用于告诉 OpenGL 顶点数据的格式,包括:
    • 每个顶点有多少数据(如每个顶点包含多少个属性)。
    • 每个属性占用多少个 GLFloat
    • 该属性在 VBO 中的位置。

示例代码:

1
2
3
4
5
6
7
8
shaderProgram.enableAttributeArray(0); // 启用顶点位置属性,对应顶点着色器中的 layout (location = 0)
shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3, 6 * sizeof(GLfloat));
// 参数解析:
// - 0:属性索引,对应顶点着色器中的 `layout (location = 0)`
// - GL_FLOAT:数据类型
// - 0:从 VBO 开始解析
// - 3:一次解析 3 个值(x, y, z)
// - 6 * sizeof(GLfloat):步长(Stride),即每个顶点的总数据大小

说明:这两句话相当于定义了两个指针,告诉着色器如何解析顶点数组。

OpenGL 着色器绑定规则

  • OpenGL 只能同时使用一个着色器程序,使用时需要 bind 绑定某个着色器。
  • VAO 也是同理,可以创建多个 VAO 来存储不同的对象(如矩形和三角形),但不能同时使用,需要绘制不同对象时,需重新 bind 另一个 VAO。

纹理映射

1
uniform sampler2D ourTexture;

用于获取 2D 纹理的像素值。


纹理过滤与旋转

  • 将矩形扩展为立方体,并增加顶点坐标至 24 个,以支持 3D 纹理映射和旋转。
1
2
3
4
5
6
7
8
9
// 立方体顶点数据(包含纹理坐标)
GLfloat vertices[] = {
// 位置 // 纹理坐标
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
// 其余五个面省略...
};
1
2
// 旋转矩阵(在片元着色器中应用)
model = glm::rotate(model, (GLfloat)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));

通过 glfwGetTime() 实现动态旋转。